如何将refcursor的值分配给PL/SQL中的变量

如何将refcursor的值分配给PL/SQL中的变量,sql,oracle,plsql,Sql,Oracle,Plsql,此存储过程调用返回单个varchar2类型值。问题是它会以refcursor的形式返回。我需要获取ID值并将其分配给变量,而不是将其打印到控制台 var r refcursor; DECLARE BEGIN P_PACKAGE.INSERT_INVOICE( IN_INVOICE_TYPE => L_INVOICE.INVOICE_TYPE, OUTPUT => :R); END; / print r; 正如您所说的,您需要将其分配给

此存储过程调用返回单个varchar2类型值。问题是它会以refcursor的形式返回。我需要获取ID值并将其分配给变量,而不是将其打印到控制台

var r refcursor;
DECLARE    
BEGIN
P_PACKAGE.INSERT_INVOICE(
    IN_INVOICE_TYPE             => L_INVOICE.INVOICE_TYPE,
    OUTPUT => :R);
END;
/
print r;

正如您所说的,您需要将其分配给一个变量。下面是一个基于Scott模式的示例

SQL> create or replace procedure p_rc (par_deptno in number, par_rc out sys_refcursor)
  2  is
  3  begin
  4    open par_rc for select ename, sal
  5      from emp
  6      where deptno = par_deptno;
  7  end;
  8  /

Procedure created.
让我们测试一下;注意第4行、第5行的变量声明和第10行的变量获取:

SQL> declare
  2    l_rc sys_refcursor;
  3    -- declare variables which will get values returned by refcursor
  4    l_ename  emp.ename%type;
  5    l_sal    emp.sal%type;
  6  begin
  7    p_rc(10, l_rc);
  8
  9    loop
 10      fetch l_rc into l_ename, l_sal;
 11      exit when l_rc%notfound;
 12      dbms_output.put_line(rpad(l_ename, 10, ' ') ||': '|| l_sal);
 13    end loop;
 14  end;
 15  /
CLARK     : 2450
KING      : 5001
MILLER    : 1300

PL/SQL procedure successfully completed.

SQL>

如您所示,我不会在SQL*Plus中定义REFCURSOR。假设您的REFCURSOR是使用类似于的语句打开的

SELECT ID
  FROM SOME_TABLE
  WHERE SOMEFIELD = some_value
那么您的PL/SQL代码应该如下所示

DECLARE    
  aString   VARCHAR2(2000);
  rc        SYS_REFCURSOR;
BEGIN
  P_PACKAGE.INSERT_INVOICE(
      IN_INVOICE_TYPE             => L_INVOICE.INVOICE_TYPE,
      OUTPUT => rc);

  FETCH rc
    INTO aString;

  DBMS_OUTPUT.PUT_LINE('aString = ''' || aString || '''');
END;

感谢您的回复,但是您能解释一下为什么这个部分不再有冒号输出=>rc;?我需要这样一行:OUTPUT=>:R;否则,末尾的print语句不会返回任何东西var r refcursor;O_发票ID Z_发票。发票ID%类型;声明开始P_包。在发票类型中插入发票=>L_发票。发票类型,输出=>R;将r提取到O_发票ID中;完;打印发票ID;很抱歉格式化了。上面的注释编译但不打印任何输出这是正确的答案。一开始我并不完全明白。谢谢。声明r sys\u refcursor;O_发票ID Z_发票。发票ID%类型;开始P_包装。在发票类型中插入发票=>L_发票。发票类型,输出=>R;将r循环提取到O_发票ID中;未找到r%时退出;端环;结束/已成功编译,但没有输出。我试图从光标上得到结果,它总是一个varchar2值,然后运行一个select。从Z_发票中选择*,其中发票id=o_发票id;这是当前失败的:ORA-06550:第34行第5列:PLS-00428:此SELECT语句06550中应包含INTO子句。00000-行%s,列%s:\n%s*原因:通常是PL/SQL编译错误*操作:很抱歉设置了格式,不确定如何设置注释的格式。CTRL+K不适用于Mei如果没有输出,请确保已启用它。在SQL*Plus或SQL Developer中,在上运行set-serveroutput。截至PLS-00428错误-如果PL/SQL中没有INTO子句,则无法运行SELECT。