在Oracle SQL Developer 1.5中打印Oracle Sys_refcursor

5

我正在尝试执行返回sys_refcursor作为输出的过程。该过程是PROCEDURE GET_EMPLOYEEs(P_ID in NUMBER, P_OUT_CURSOR OUT SYS_REFCURSOR);

我在SQL Developer 1.5中编写了以下匿名块,并且执行良好,但当我尝试打印游标时,出现错误。该游标返回emp_name、salary和其他列。

set serveroutput on;
declare
result sys_refcursor;
begin
emp.emp360_utils.GET_EMPLOYEEs(222334,result); 
dbms_output.put_line(result); // Error here
end;

错误是:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'

更新:为游标进行了迭代,但仍然出现“对变量dummycursor的无效引用”错误。

    set serveroutput on;
    declare
    dummycursor sys_refcursor;
    result sys_refcursor;
    begin
     emp.emp360_utils.GET_EMPLOYEEs(222334,result); 
    LOOP
    fetch result into dummycursor;
    EXIT when result%notfound;
    dbms_output.putline(dummycursor.lsn);
    end loop;
    end;

在PL/SQL中,sys_refcursor只是指向描述游标的数据结构的指针。它不是数据。你不能将它传递给PUT_LINE并期望它打印游标返回的各个字段。你需要从游标中提取数据到程序中声明的变量中,然后打印这些变量的内容。祝你好运。 - Bob Jarvis - Слава Україні
2个回答

14

您需要循环遍历游标,并为其中的每一行打印出各个字段。在您更新的版本中,需要将游标提取到本地标量变量中,而不是另一个引用游标:

set serveroutput on;
declare
  result sys_refcursor;
  lsn number; -- guessing the data type
begin
  emp.emp360_utils.GET_EMPLOYEEs(222334,result); 
  loop
    fetch result into lsn; -- and other columns if needed
    exit when result%notfound;
    dbms_output.put_line(lsn);
  end loop;
end;
/

我猜测lsn是一个数字,如果不是,请声明正确的类型。如果光标返回的列超过一个,则需要为每个列声明本地变量,并将它们全部提取到这些变量中,即使你只显示其中一个。


如果你只想显示它,那么可以使用绑定变量来代替(在当前版本和1.5.0版本中检查过):

variable result refcursor

begin
  emp.emp360_utils.GET_EMPLOYEEs(222334, :result); 
end;
/

print result

请注意,变量命令variable不在declare块内;它是一个SQL开发人员命令,不是PL/SQL命令。同样地,print也是如此,尽管两者都只在SQL*Plus文档中有记录。此外,请注意块内:result前面的冒号,这表示它是绑定变量,而不是本地PL/SQL变量。


我正在尝试迭代游标,但是出现了错误。代码已更新。 - Sanjana
1
@Sanjana 已更新;你需要将 ref cursor 中的每一列都提取到自己的本地变量中,而不是将整个东西提取到一个新的 ref cursor 中。 - Alex Poole

2
您可以在包源中使用“运行”按钮来执行过程,Output variables选项卡中查看游标内容。enter image description hereenter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接