如何将refcursor的值分配给PL/SQL中的变量
此存储过程调用返回单个varchar2类型值。问题是它会以refcursor的形式返回。我需要获取ID值并将其分配给变量,而不是将其打印到控制台如何将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; 正如您所说的,您需要将其分配给
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。