linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux数据库 >

Oracle 游标处理

时间:2017-12-05  来源:未知  作者:admin666

开发或维护的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(直到运行时才知道这条查询)

更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

友情链接