游标变量

在PLOSCAR中,游标类型的变量代表一个查询生成的结果集,通过游标变量可以实现对结果集的遍历和对结果集中行数据的访问。

游标变量的声明可以使用refcursor类型或CURSOR类型。

语法:

cursor_decl ::=

param_decls ::=

param_decl ::=

参数:

<cursor_decl> 游标变量声明语句

cursor_name 游标变量名

<param_decls> 游标参数声明列表

<param_decl> 游标参数声明

var_name 游标参数名

data_type 游标参数类型

query_expression PLOSCAR查询表达式

说明:

  • REFCURSOR类型的游标变量是未绑定的游标,可以用于任何查询表达式。
  • CURSOR类型的游标变量已经和query_expression绑定。
  • CURSOR类型的游标变量可以带<param_list>,也可不带。query_expression中的参数将在游标被打开时用实际的参数代换。

示例:游标变量

--  清理环境
DROP PROCEDURE proc;
DROP TABLE tab;

--创建表
CREATE TABLE tab 
(
    a int,
    b int,
    c int
);
insert into tab values(11,12,13);
insert into tab values(21,22,23);

CREATE OR REPLACE PROCEDURE proc AS
DECLARE
    CURSOR c1 IS select a from tab order by a;
    CURSOR c2(t int) IS select b from tab where b = t;
    c3 REFCURSOR;
    ta int;
    tb int;
    tc int;
    item tab%rowtype;
BEGIN
    FOR item IN c1 LOOP
        ta := item.a;
        dbms_output.put_line( 'c1:' || ta);
    END LOOP;
    
    FOR item IN c2(12) LOOP
        tb := item.b;
        dbms_output.put_line( 'c2:' || tb);
    END LOOP;
    
    OPEN c3 FOR SELECT c FROM tab ORDER BY a;
    LOOP
        FETCH c3 INTO tc;
        EXIT WHEN NOT FOUND;
        dbms_output.put_line( 'c3:' || tc);
    END LOOP;
    CLOSE c3;   
END;

/  

EXEC proc;
c1:11
c1:21
c2:12
c3:13
c3:23
--  删除表
DROP PROCEDURE proc; 
DROP TABLE tab CASCADE;

所有这三个变量都是类型为 refcursor,但是第一个已经绑定了一个声明完整的查询,第二个是绑定了一个带参数的查询(key 将在游标打开的时候被代换成一个整数),而最后一个可以用于任何查询。变量c3可以称之为未绑定的,因为它没有和任何查询相绑定。

游标变量的具体使用方法请见 游标变量