日期:2014-05-17  浏览次数:20932 次

SQLPLUS里测试带返回参数的存储过程
过程名p_test
入参 aa varchar2
出参 bb sys_refcursor

在SQLPLUS里如何将sys_refcursor 这个结果集获取出来呢


------解决方案--------------------
SQL code

--你试过么,就说定义不了。

[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>

------解决方案--------------------
sys_refcursor 实质就是 refcursor
所以,你只要定义 refcursor 就可以
你如果 var bb sys_refcursor 这肯定就报错了

探讨

引用:
SQL code


var aa varchar2(2000);
var bb REFCURSOR;
exec p_test(:aa,:bb);
print bb;


var bb REFCURSOR; --我的出参是sys_refcursor类型,定义不了

------解决方案--------------------
pl/sql 是定义不了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 ] ]