Sql 如何存储返回sysrefcursor的函数的结果?
场景:有一个过程,其中有一个游标。 我需要调用一个函数,该函数将从该游标值获取输入,并返回Sql 如何存储返回sysrefcursor的函数的结果?,sql,oracle,function,plsql,cursor,Sql,Oracle,Function,Plsql,Cursor,场景:有一个过程,其中有一个游标。 我需要调用一个函数,该函数将从该游标值获取输入,并返回SYS\u REFCURSOR 我需要将函数的结果存储在另一个变量/游标中&需要从过程返回这个值作为out参数 我正在使用Oracle11g 我怎样才能继续 PFB我的方法: create or replace procedure prc_test (p_dept_id in number, c_detail out sysrefcursor)--need to add extra out
SYS\u REFCURSOR
我需要将函数的结果存储在另一个变量/游标中&需要从过程返回这个值作为out参数
我正在使用Oracle11g
我怎样才能继续
PFB我的方法:
create or replace procedure prc_test
(p_dept_id in number,
c_detail out sysrefcursor)--need to add extra out parameter
as
var1 varchar2(200) :=null;
begin
open c_detail for
select -1 from dual;
if p_dept_id is not null then
open c_detail for
select emp_no from emp
where dept_id=p_dept_id;
--i need to retrn value of 'get_emp_dtls' function as out parameter.
end if;
end procedure;
/
要调用的函数
CREATE OR REPLACE FUNCTION get_emp_dtls
(p_emp_no IN EMP.EMP_NO%TYPE)
RETURN SYS_REFCURSOR
AS
o_cursor SYS_REFCURSOR;
BEGIN
OPEN o_cursor FOR
SELECT
ENAME,
JOB
FROM emp
WHERE EMP_NO = p_emp_no;
RETURN o_cursor;
-- exception part
END;
/
这是一个接受varchar2变量并返回refcursor(弱类型)的函数 下面是一个过程,该过程将游标值作为参数传递给函数,返回的游标作为OUT参数传递
CREATE OR replace PROCEDURE Pr_pass_out_cur(v_2 OUT SYS_REFCURSOR)
IS
func_arg VARCHAR2(3);
other_arg VARCHAR2(3);
CURSOR c_2 IS
SELECT 'ABC' col1,
'DEF' col2
FROM dual;
BEGIN
LOOP
FETCH c_2 INTO func_arg, other_arg;
EXIT WHEN c_2%NOTFOUND;
v_2 := Fn_return_cur(func_arg);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
让我知道您的反馈。到目前为止您做了什么?请显示您的代码。与任何其他数据类型相同:
somevar:=somefunction()代码>什么不起作用?somevar的数据类型是什么?实际上,我的函数将返回一个游标,所以我对varable的数据类型感到困惑?很可能大多数部门都有多个员工:您希望如何处理?另外,如果部门没有员工,您希望发生什么?因为我的需求非常复杂,为了描述我面临的实际挑战,我只创建了一个与我的需求类似的虚拟过程/功能。对不起,我用错桌子了。在我的例子中,两个表中都会有1:1的映射谢谢Kaushik的输入。现在我知道了如何在游标中存储函数的值。
CREATE OR replace PROCEDURE Pr_pass_out_cur(v_2 OUT SYS_REFCURSOR)
IS
func_arg VARCHAR2(3);
other_arg VARCHAR2(3);
CURSOR c_2 IS
SELECT 'ABC' col1,
'DEF' col2
FROM dual;
BEGIN
LOOP
FETCH c_2 INTO func_arg, other_arg;
EXIT WHEN c_2%NOTFOUND;
v_2 := Fn_return_cur(func_arg);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/