-------------------游标表达式--------------------------

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;              

-----------------------------------------------