游标变量¶
在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可以称之为未绑定的,因为它没有和任何查询相绑定。
游标变量的具体使用方法请见 游标变量