在上一文中,我们介绍了使用PLSQL的显式游标,该类游标在声明之初已经和sql语句进行了绑定,属于静态的游标。而本文中我们介绍的参考游标,属于动态游标,在其声明时未绑定sql语句,而我们在使用时可以动态的绑定sql语句。
如下,假设存在下表emp:
现在我们利用参考游标来实现打印输出deptno为20的所有雇员的信息:
declare
type cur_ref is ref cursor; --定义参考游标类型
cur_emp cur_ref; --声明参考游标变量
var_emp emp%rowtype;
begin --打印输出deptno为20的全部成员的信息
open cur_emp for select * from emp where deptno=20;
loop
fetch cur_emp into var_emp;
dbms_output.put_line('姓名:'||var_emp.ename||',薪资:'||var_emp.sal);
exit when cur_emp%notfound; end loop;
close cur_emp;
end;
/
我们可以总结参考游标的使用步骤如下:
(1)在plsql的声明区,使用如下的格式定义参考游标类型:
type 游标类型名称 is ref cursor
(2)声明参考游标变量
(3)打开参考游标变量
open 变量名称 for sql语句
(4)利用循环变量游标
(5)关闭游标
从上面的例子中我们可以发现,与上一文中的静态的显式游标不同,我们在使用参考游标变量时需要手动的去打开游标,因为在此时我们实现了游标个sql语句的绑定,所以在使用参考游标时,遍历游标便不能再使用for循环。
使用参考游标的灵活之处就在用,我们可以随时随地的修改与游标绑定的sql语句,比如我们在打印出deptno为20的全部雇员信息后,再打印deptno为30的雇员信息,那么可以使用如下的方法:
declare
type cur_ref is ref cursor;
cur_emp cur_ref;
var_emp emp%rowtype;
begin
--打印输出deptno为20的全部成员的信息
open cur_emp for select * from emp where deptno=20;
loop
fetch cur_emp into var_emp;
dbms_output.put_line('姓名:'||var_emp.ename||',薪资:'||var_emp.sal);
exit when cur_emp%notfound;
end loop;
close cur_emp;
--打印输出deptno为30的全部成员的信息
open cur_emp for select * from emp where deptno=30;
loop
fetch cur_emp into var_emp;
dbms_output.put_line('姓名:'||var_emp.ename||',薪资:'||var_emp.sal);
exit when cur_emp%notfound;
end loop;
close cur_emp;
end;
/