这是一个工作示例,声明 refcursor 然后通过在匿名块中调用 proc 来分配值。然后你打印它
var x REFCURSOR ;
declare
/*a no cleanup procedure*/
procedure GetMeMyRefCursor(outter out nocopy sys_refcursor)
as
begin
open outter for
select level
from dual
connect by level <= 5;
end GetMeMyRefCursor;
begin
GetMeMyRefCursor(:x);
/*note you pass in the refcursor you created via the :X*/
end ;
/
print x;
/*now print it*/
/*LEVEL
----------------------
1
2
3
4
5*/
基于评论:现在使用您的评论,您遇到了 IN/OUT 参数问题,而不是打印问题(没有阅读标题,只是问题和其他回复)
这有效:(基于您的代码)
create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY
( projectId IN NUMBER,
resultset_out OUT sys_refcursor
) AS
BEGIN
OPEN resultset_out for
SELECT level from dual connect by level <= projectId;
/* DBMS_OUTPUT.PUT_LINE(resultset_out);*/
END GET_PROJECT_DRF_HISTORY;
/
var results REFCURSOR;
--this needs to be REFCURSOR (at least in 10g and 11i)
exec GET_PROJECT_DRF_HISTORY(5, :results);
print results;
/
如果你想在 SQL Developer 中调试,你也可以直接从 SQL Developer 调试包和过程(这可能是一个真正的救星),这真的很容易:
在连接->您的架构中->程序-> GET_PROJECT_DRF_HISTORY 右键单击并“编译以进行调试”。然后在程序中放置一个断点,然后右键单击并“调试”它(这将创建一个匿名块——见下文——你可以在其中输入你的值等)
DECLARE
PROJECTID NUMBER;
RESULTSET_OUT sys_refcursor;
BEGIN
PROJECTID := NULL;
GET_PROJECT_DRF_HISTORY(
PROJECTID => PROJECTID,
RESULTSET_OUT => RESULTSET_OUT
);
-- Modify the code to output the variable
-- DBMS_OUTPUT.PUT_LINE('RESULTSET_OUT = ' || RESULTSET_OUT);
END;
(http://www.oracle.com/technetwork/developer-tools/sql-developer/sqldeveloperwhitepaper-v151-130908.pdf第11页)
否则,如果您从 Developer 中执行所有这些操作,则错误看起来不会像它应该出现的那样。
但我真正认为正在发生的是您的 VAR 不正确,因此它不存在!
variable results sys_refcursor;
Usage: 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 ] ]
所以,从我最初的例子“var x REFCURSOR ;”开始 应该管用