PL/SQL 游标

来源:互联网 发布:淘宝下载到桌面 编辑:程序博客网 时间:2024/06/05 06:42

游标是一个指向存储有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_REFCURSORIS   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;
0 0