Oracle 游标处理

开发或维护的DBA 找工作时可能问到的问题:请简述描述下光标的类型,说一下普通光标和REF光标之间的区别,以及什么时候该正确应用哪一个???

1、显式cursor

 明确声明一个cursor,  声明类型  cursor cursor_name(parameter list) is select ....

游标从declare, open, fetch, close 是一个完整的生命旅程。

显示cursor是静态cursor,它的作用域是全局的,静态cursor也只有PL/SQL代码才可以使用它。示例如下:

declare

cursor 光标名 (参数名 in varchar2) is

select 列名 from 表名 where 条件;

定义变量;

begin

open 光标名 (参数);

loop

fetch 光标名 into 变量名;

exit when 光标名%notfound;

循环体;

end loop;


  close 光标名;

可多次重新打开光标执行一个生命周期;

2、隐式cursor

没有明确的定义cursor 的 declare, 在Oracle的PL/SQL中,所有的DML操作都被Oracle内部解析为一个cursor 名为SQL的隐式游标;  循环操作中的指针for循环,都是隐式cursor.

隐式cursor示例一:

CREATE TABLE zrp (str VARCHAR2(10));
        insert into zrp values ('ABCDEFG');
        insert into zrp values ('ABCXEFG');
        insert into zrp values ('ABCYEFG');
        insert into zrp values ('ABCDEFG');
        insert into zrp values ('ABCZEFG');
        COMMIT;
       
        SQL> begin
          2    update zrp SET str = 'updateD' where str like '%D%';
          3    if SQL%ROWCOUNT= 0 then
          4      insert into zrp values ('1111111');
          5    end if;
          6 end;
          7 /
       
        PL/SQL procedure successfully completed
       
        SQL> select * from zrp;
       
        STR
        ----------
        updateD
        ABCXEFG
        ABCYEFG
        updateD
        ABCZEFG
       
        SQL>
        SQL> begin
          2    update zrp SET str = 'updateD' where str like '%S%';
          3    if SQL%ROWCOUNT= 0 THEN
          4      insert into zrp values ('0000000');
          5    end if;
          6 end;
          7 /
       
        PL/SQL procedure successfully completed
       
        SQL> select * from zrp;
       
        STR
        ----------
        updateD
        ABCXEFG
        ABCYEFG
        updateD
        ABCZEFG
        0000000
      6 rows selected
       
        SQL>

隐式cursor示例二:

begin
          for rec in (select gsmno,status from gsm_resource) loop
              dbms_output.put_line(rec.gsmno||'--'||rec.status);
          end loop;
        end;
        /

3、 ref cursor

   ref  cursor 属于动态cursor(直到运行时才知道这条查询)

相关推荐