0

我无法在 Oracle Sql Developer 中测试这个简单的存储过程。存储过程执行一个简单的选择并返回一个游标。

create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY

( projectId IN NUMBER,
  resultset_out OUT sys_refcursor
) AS

BEGIN

  OPEN resultset_out for
  SELECT * from GLIDE_HISTORY
  where GLIDE_HISTORY.PRJ_ID = projectId;
/*  DBMS_OUTPUT.PUT_LINE(resultset_out);*/

END GET_PROJECT_DRF_HISTORY;

为了测试这个过程,我使用了下面的脚本:

variable results sys_refcursor;

exec get_project_drf_history(3345, :results);

print :results;

作为 Oracle 和 Sql Developer 工具的新手,我很难理解这里的错误是什么。我无法在 Sql*Plus 中检查这一点,因为我没有这样做的密码。我正在使用 Oracle Sql Developer 1.1.2.25 和 Oracle 10g。

有人可以帮帮我吗?先感谢您。

4

3 回答 3

1

萨米,

变量声明应该是refcursor而不是 sys_refcursor。此外,当您打印结果时,您正在打印变量本身,因此不需要:(用于指示它是绑定变量)。

我能够在 SQL Developer(当然还有 sql plus)中成功运行以下脚本。对于 SQL Developer,使用 F5 将其作为脚本运行。

--Creating Procedure
create or replace procedure test_ref(
i_limit number,
o_results out sys_refcursor
) is
begin
   open o_results for 
      'select object_name 
        from all_objects
        where rownum < ' || i_limit;
end;
/

然后是调用此过程的脚本。(使用 F5 作为脚本执行)。

var c1 refcursor;

exec test_ref(10,:c1);

print c1;
于 2010-09-21T18:55:22.093 回答
0

这是一个工作示例,声明 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 ;”开始 应该管用

于 2010-09-21T18:04:50.943 回答
0

我建议让您的管理员升级您的 SQL Developer 版本。你的已经过时了,你可能会遇到一些不为人知的错误。(当我尝试使用版本 1 时我这样做了)你现在应该在 2.1 上。

于 2010-09-23T02:26:53.480 回答