-------------------游标表达式--------------------------
declare
type rc is ref cursor;--定义一个游标
cursor csr_hierarchy is select h.hrc_descr,cursor(select o.org_long_name
from org_tab o
where h.hrc_code=o.hrc_code) --游标表达式
from hrc_tab h;
hrc_rec rc;
v_hrc_descr varchar2(20);
v_org_long_name varchar2(30);
begin
open csr_hierarchy;
loop
fetch csr_hierarchy into v_hrc_descr,hrc_rec;
exit when (csr_hierarchy%notfound);
loop
fetch hrc_rec into v_org_long_name;
exit when (hrc_rec%notfound);
dbms_output.put_line(v_hrc_descr||' '||v_org_long_name);
end loop;
end loop;
close csr_hierarchy;
exception when others then
null;
end;
打开的游标数=hrc_tab的行数+1
打开游标的数量是无法控制的。
关于游标的参数:
SQL> conn /as sysdba
Connected.
SQL> show parameter open
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300 --一个会话中可以打开的最大游标数
超过300的话就要报错的,当使用游标表达式的时候,一定要注意外层表hrc_tab的行数不能过多,尽量保证hrc_tab是小表。
练习:用游标表达式实现现面的显示:员工的姓名、编号、薪资、职位,雇佣日期、部门名称
declare
type rc is ref cursor;
cursor rc_v is select h.dname, cursor(select a.ename,a.empno,a.sal,a.job,a.hiredate
from emp a where a.deptno=h.deptno) --游标表达式
from dept h;
v_dname varchar2(20);
v_ename varchar2(20);
v_sal number;
v_job varchar2(20);
v_empno number;
v_hiredate date;
emp_cursor rc;
begin
open rc_v;
loop
fetch rc_v into v_dname,emp_cursor;
exit when(rc_v%notfound);
loop
fetch emp_cursor into v_ename,v_empno,v_sal,v_job,v_hiredate;
exit when(emp_cursor%notfound);
dbms_output.put_line(v_dname||','||v_ename||','||v_sal||','||v_job||','||v_hiredate);
end loop;
end loop;
close rc_v;
end;
-----------------------------------------------