【发布时间】:2020-04-25 19:34:24
【问题描述】:
我需要从过程、记录集和单个值中返回值(从记录集中提取)
CREATE TABLE EMP
(
EMP_ID number;
EMP_NAME varchar2(20);
EMP_FLAG char(1);
);
CREATE TABLE SALARY
(
EMP_ID number;
EMP_SAL number;
);
BEGIN
insert into EMP values(10,'John','N');
insert into EMP values(20,'May','Y');
insert into SALARY values(10,10000);
insert into SALARY values(10,25000);
END;
/
这是我的程序
CREATE OR REPLACE PROCEDURE TEST(Flag in char(1),curEMP out SYS_REFCURSOR,Sal out number)
v_sal number;
v_emp_id number;
v_name varchar2(20);
AS
open curEMP for
select e.emp_id
,e.emp_name
,s.sal
from emp e
left join sal s on e.emp_id = s.emp_id
where e.emp_flag = Flag;
loop
fetch curEMP into v_emp_id,v_name,v_Sal; --in real life there are more than 20+ fields
exit when curEMP%notfound;
end loop;
Sal := v_sal;
END TEST;
/
调用过程的脚本
set serveroutput on;
variable cr refcursor;
variable sal number;
exec TEST('Y',:cr,:sal);
print cr;
print sal;
这是输出
输出
sal
25000
但是,我需要这样的输出
--从光标列表输出
emp_id emp_name sal
20 May 25000
--来自sal变量
sal
25000
【问题讨论】:
-
这里有两个问题:首先,当您返回一个 REF CURSOR 时,您应该打开它但不能从中获取。调用您的程序应该进行提取,然后关闭游标。其次,如果您的查询返回多于一行,那么这些行可能会以任何顺序返回,因此 SAL 的内容可能会发生变化。您需要进行单独的查询以获得调用者想要的准确 SAL 值。
-
感谢您的建议,我现在尝试按照您的指示进行操作。
标签: oracle stored-procedures plsql oracle12c