【问题标题】:How to store result of a function which will return sysrefcursor?如何存储将返回参考光标的函数的结果?
【发布时间】:2017-12-29 01:05:28
【问题描述】:

场景:有一个过程,里面有一个游标。 我需要调用一个函数,该函数将从该光标值中获取输入并返回 SYS_REFCURSOR

我需要将该函数的结果存储在不同的变量/游标中,并且需要从过程中将该值作为输出参数返回。

我正在使用 Oracle 11g。

我该如何继续?

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;
/

【问题讨论】:

  • 你到现在都做了什么?请出示您的代码。
  • 与任何其他数据类型相同:somevar := somefunction(); 什么不起作用?
  • somevar 的数据类型是什么?实际上我的函数会返回一个游标,所以我对变量的数据类型感到困惑?
  • 大多数部门可能有不止一名员工:您想如何处理?另外,如果部门没有员工,你想怎么办?
  • 由于我的要求非常复杂,为了描述我面临的实际挑战,我只是创建了一个类似于我的要求的虚拟程序/函数。对不起,我用错了桌子。在我的情况下,两个表中都会有 1:1 映射

标签: sql oracle function plsql cursor


【解决方案1】:

这是你的函数,它接受一个 varchar2 变量并返回一个 refcursor(弱类型)。

 CREATE OR replace FUNCTION fn_return_cur(v IN VARCHAR2)
RETURN SYS_REFCURSOR
IS
  c1 SYS_REFCURSOR;
BEGIN
    OPEN c1 FOR
      SELECT 'ABC'
      FROM   dual
      WHERE  'col1' = v;

    RETURN c1;
END;

/  

这是一个将游标值作为参数传递给函数并将返回的游标作为 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;

/  

让我知道您的反馈。

【讨论】:

  • 感谢 Kaushik 的意见。现在我知道了如何将函数的值存储在游标中。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2013-02-20
相关资源
最近更新 更多