create or replace procedure getEmpByDept(in_deptNo in emp.deptno%type, out_curEmp out SYS_REFCURSOR) as begin open out_curEmp for SELECT * FROM emp WHERE deptno = in_deptNo ; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20101, 'Error in getEmpByDept' || SQLCODE ); end getEmpByDept;
过程没问题,现在的问题是在SQLPLUS里 如何把 out_curEmp 这个结果集获取出来。
var aa varchar2(2000); var bb REFCURSOR; exec p_test(:aa,:bb); print bb;
1. 先定义参数 2. 执行procedure时,传入参数 3. print 参数
var bb REFCURSOR; --我的出参是sys_refcursor类型,定义不了
--你试过么,就说定义不了。[TEST@myoracle] SQL>create or replace procedure my_proc( 2 i_aa varchar2, 3 o_cursor out sys_refcursor 4 ) 5 as 6 begin 7 open o_cursor for 8 select * from tab where 1=i_aa; 9 end; 10 /过程已创建。[TEST@myoracle] SQL>var aa varchar2(2000); [TEST@myoracle] SQL>var bb refcursor; [TEST@myoracle] SQL>begin :aa := 1; end; 2 /PL/SQL 过程已成功完成。[TEST@myoracle] SQL>exec my_proc(:aa,:bb);PL/SQL 过程已成功完成。[TEST@myoracle] SQL>print :bb;TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- TEST TABLE T1 TABLE[TEST@myoracle] SQL>
out_curEmp out SYS_REFCURSOR) as
begin
open out_curEmp for
SELECT * FROM emp WHERE deptno = in_deptNo ;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20101,
'Error in getEmpByDept' || SQLCODE );
end getEmpByDept;
过程没问题,现在的问题是在SQLPLUS里 如何把 out_curEmp 这个结果集获取出来。
var aa varchar2(2000);
var bb REFCURSOR;
exec p_test(:aa,:bb);
print bb;
2. 执行procedure时,传入参数
3. print 参数
var bb REFCURSOR; --我的出参是sys_refcursor类型,定义不了
--你试过么,就说定义不了。[TEST@myoracle] SQL>create or replace procedure my_proc(
2 i_aa varchar2,
3 o_cursor out sys_refcursor
4 )
5 as
6 begin
7 open o_cursor for
8 select * from tab where 1=i_aa;
9 end;
10 /过程已创建。[TEST@myoracle] SQL>var aa varchar2(2000);
[TEST@myoracle] SQL>var bb refcursor;
[TEST@myoracle] SQL>begin :aa := 1; end;
2 /PL/SQL 过程已成功完成。[TEST@myoracle] SQL>exec my_proc(:aa,:bb);PL/SQL 过程已成功完成。[TEST@myoracle] SQL>print :bb;TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST TABLE
T1 TABLE[TEST@myoracle] SQL>
所以,你只要定义 refcursor 就可以
你如果 var bb sys_refcursor 这肯定就报错了
但在sqlplus里完全可以var aa varchar2(2000);
var bb REFCURSOR;
exec p_test(:aa,:bb);
print bb;另sqlplus里,
var bb sys_refcursor;
显示:用法: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
BINARY_FLOAT | BINARY_DOUBLE ] ]