PL/SQL 游标

32 篇文章 1 订阅
15 篇文章 1 订阅

游标是一个指向存储有SELECT或DML语句处理信息的私有SQL区域的指针。在使用SQL时数据库在大部分时候自动维护游标,但是也可以人为的操作游标。

#显式的定义游标
通过在DECLARE区域使用CURSOR IS声明游标,和表与视图一样,可以基于游标声明记录类型的变量。

DECLARE
     CURSOR cursor_name
      IS
           SELECT *
             FROM table_name;
     cursor_record   cursor_name%ROWTYPE;
  BEGIN
     OPEN cursor_name;
     LOOP
        FETCH cursor_name INTO cursor_record;
        EXIT WHEN cursor_name%NOTFOUND;
        statements;
     END LOOP;
     CLOSE cursor_name;
  END; 

游标声明后,在使用时,需要首先打开游标OPEN cursor_name;,然后才能提取数据FETCH cursor_name INTO cursor_record;,除了把数据提取进入记录中,也可以通过INTO后跟多个变量的方式把数据提取进多个变量中,使用完游标后,需要关闭游标CLOSE cursor_name;,对于直接在包级别定义的游标,在打开游标后,除非直到主动关闭或者当前的数据库会话结束,否则游标不会被关闭,而对于在过程或函数中定义的游标,在过程或函数结算后,游标会自动关闭,但是更推荐的做法是无论在哪里定义的游标,使用完后都显式地关闭。

如果游标的查询不能够对应到任何数据,游标属性cursor_name%NOTFOUND返回TRUE,类似的游标还有属性cursor_name%FOUND在查询到数据时候返回TRUEcursor_name%ROWCOUNT返回调用时提取的记录数,cursor_name%ISOPEN游标打开时返回TRUE

#游标变量
游标变量顾名思义就是指向游标的变量,游标变量与游标不同,游标本身不是变量,所以游标不能作为参数传递到过程或函数中,但是游标变量却可以。

通过SYS_REFCURSOR声明游标变量

DECLARE
     cursor_variable_name   SYS_REFCURSOR;
     table_record table_name%ROWTYPE;
  BEGIN
     OPEN cursor_variable_name FOR
          SELECT *
                FROM table_name;
     LOOP
        FETCH cursor_variable_name INTO table_record;
        EXIT WHEN cursor_variable_name%NOTFOUND;
        statements;
     END LOOP;
     CLOSE cursor_variable_name;
  END; 

游标变量使用OPEN FOR的语法指定其指向的游标并且打开游标,其他操作和游标一致。

OPEN FOR支持其指定的游标以变量表示,所以可以实现动态SQL的效果。

CREATE OR REPLACE FUNCTION 
dynamic_sql (query_in IN VARCHAR2)
   RETURN SYS_REFCURSOR
IS
   cursor_variable   SYS_REFCURSOR;
BEGIN
   OPEN cursor_variable FOR query_in;
   RETURN cursor_variable;
END dynamic_sql; 

之后可以传入任意SQL,获取对应的游标变量

BEGIN
    dynamic_sql('select * from table_name');
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值