SYS_REFCURSOR

1、使用SYS_REFCURSOR
SQL> Declare
  2    Cur Sys_Refcursor;
  3    R   scott.dept%Rowtype;
  4  Begin
  5    Open Cur For Select * From scott.dept;
  6    Loop
  7      Fetch Cur Into R;
  8      Exit When Cur%Notfound;
  9      dbms_output.put_line('DEPTNO:'||R.deptno||' DNAME:'||R.DNAME||' LOC:'||R.LOC);
 10    End Loop;
 11  End;
 12  /
DEPTNO:10 DNAME:ACCOUNTING LOC:NEW YORK
DEPTNO:20 DNAME:RESEARCH LOC:DALLAS
DEPTNO:30 DNAME:SALES LOC:CHICAGO
DEPTNO:40 DNAME:OPERATIONS LOC:BOSTON
PL/SQL procedure successfully completed


2、使用自定义游标
SQL> Declare
  2    Type T_Cur Is Ref Cursor Return scott.dept%Rowtype;
  3    Cur T_Cur;
  4    R   Cur%Rowtype;
  5  Begin
  6    Open Cur For Select * From scott.dept;
  7    Loop
  8      Fetch Cur Into R;
  9      Exit When Cur%Notfound;
 10      dbms_output.put_line('DEPTNO:'||R.deptno||' DNAME:'||R.DNAME||' LOC:'||R.LOC);
 11    End Loop;
 12  End;
 13  /
DEPTNO:10 DNAME:ACCOUNTING LOC:NEW YORK
DEPTNO:20 DNAME:RESEARCH LOC:DALLAS
DEPTNO:30 DNAME:SALES LOC:CHICAGO
DEPTNO:40 DNAME:OPERATIONS LOC:BOSTON
PL/SQL procedure successfully completed


3、使用SYS_REFCURSOR作为输出游标
SQL> Create Or Replace Procedure Proc1(Cur_Out Out Sys_Refcursor)
  2  Is
  3  Begin
  4    Open Cur_Out For Select * From Dept;
  5  End;
  6  /
Procedure created
SQL> Declare
  2    Cur Sys_Refcursor;
  3    R   dept%Rowtype;
  4  Begin
  5    Proc1(Cur);
  6    Loop
  7      Fetch Cur Into R;
  8      Exit When Cur%Notfound;
  9      dbms_output.put_line('DEPTNO:'||R.deptno||' DNAME:'||R.DNAME||' LOC:'||R.LOC);
 10    End Loop;
 11  End;
 12  /
DEPTNO:10 DNAME:ACCOUNTING LOC:NEW YORK
DEPTNO:20 DNAME:RESEARCH LOC:DALLAS
DEPTNO:30 DNAME:SALES LOC:CHICAGO
DEPTNO:40 DNAME:OPERATIONS LOC:BOSTON
PL/SQL procedure successfully completed


4、使用自定义游标作为输出游标
SQL> Create Or Replace Package pck2
  2  Is
  3    Type t_csr Is Ref Cursor ;
  4  End;
  5  /
Package created
SQL> Create Or Replace Procedure Proc2(Cur_Out Out pck2.t_csr)
  2  Is
  3  
  4  Begin
  5    Open Cur_Out For Select * From Dept;
  6  End;
  7  /
Procedure created
SQL> Declare
  2    Cur pck2.t_csr;
  3    R   dept%Rowtype;
  4  Begin
  5    Proc2(Cur);
  6    Loop
  7      Fetch Cur Into R;
  8      Exit When Cur%Notfound;
  9      dbms_output.put_line('DEPTNO:'||R.deptno||' DNAME:'||R.DNAME||' LOC:'||R.LOC);
 10    End Loop;
 11  End;


 12  /
DEPTNO:10 DNAME:ACCOUNTING LOC:NEW YORK
DEPTNO:20 DNAME:RESEARCH LOC:DALLAS
DEPTNO:30 DNAME:SALES LOC:CHICAGO
DEPTNO:40 DNAME:OPERATIONS LOC:BOSTON
PL/SQL procedure successfully completed



### 使用 OUT SYS_REFCURSOR 参数传递游标 在 Oracle PL/SQL 中,`SYS_REFCURSOR` 是一种用于表示数据库查询结果集的数据类型。通过 `OUT` 参数可以将这种类型的游标从存储过程或函数返回给调用者。 #### 创建带有 OUT SYS_REFCURSOR 的存储过程 定义一个简单的存储过程来演示如何声明并打开 `SYS_REFCURSOR` 类型的输出参数: ```plsql CREATE OR REPLACE PROCEDURE get_employee_data ( p_deptno IN NUMBER, emp_cursor OUT SYS_REFCURSOR ) IS BEGIN OPEN emp_cursor FOR SELECT ename, job, hiredate FROM emp WHERE deptno = p_deptno; END; / ``` 此代码创建了一个名为 `get_employee_data` 的存储过程,它接受部门编号作为输入,并通过 `emp_cursor` 返回该部门员工的信息[^1]。 #### 调用带 OUT SYS_REFCURSOR 参数的过程 为了展示如何接收来自上述存储过程的结果,在客户端应用程序中可以通过绑定变量的方式处理这个游标对象。下面是一个匿名PL/SQL块的例子,展示了如何调用上面定义好的存储过程并将获取到的数据打印出来: ```plsql DECLARE v_emp_cur SYS_REFCURSOR; v_ename VARCHAR2(50); v_job VARCHAR2(50); v_hiredate DATE; BEGIN -- 调用存储过程 get_employee_data(p_deptno => 10, emp_cursor => v_emp_cur); LOOP FETCH v_emp_cur INTO v_ename, v_job, v_hiredate; EXIT WHEN v_emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Name: ' || v_ename || ', Job: ' || v_job || ', Hire Date:'|| TO_CHAR(v_hiredate,'DD-MON-YYYY')); END LOOP; CLOSE v_emp_cur; END; / ``` 这段脚本首先声明了一个 `SYS_REFCURSOR` 变量 `v_emp_cur` 来保存由 `get_employee_data` 过程传回的游标数据;接着在一个循环里逐行取出记录直到没有更多行为止;最后关闭游标完成操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值