【问题标题】:Calling ref_cursor from another PLSQL function从另一个 PLSQL 函数调用 ref_cursor
【发布时间】:2016-03-28 10:38:16
【问题描述】:

我有三个 PLSQL 函数:A、B 和 C。

想法是这样的:C 调用 B,B 调用 A。

  • 当函数 A 被 B 调用时,它返回一个数值作为状态指示符和一个带有表格结果的引用游标。 例如。 function_A(A1 in varchar2, A2 out sys_refcursor) 返回数;

  • 函数 B 在接收到来自 A 的结果时,应在将结果传递给 C 之前重新格式化结果,也以引用游标的形式。

A是现有的功能,不能修改,而B和C是全新的功能。

问题是,如何从 A 中获取 ref 游标?我能够得到函数返回的数值(即状态指示器),但是我在从 A 中获取 ref 游标的结果时遇到问题。

  1. 如果我从B调用A,我可以假设A的引用游标是自动打开的吗?

  2. 从 A 的 ref 游标中获取结果的逻辑步骤是什么?例如。我可以将结果提取到对象类型中吗?

P/S。我的编程经验非常有限,并且在 PLSQL 方面只有几个月的新手。

任何提示将不胜感激。

【问题讨论】:

    标签: plsql ref-cursor


    【解决方案1】:

    由于您没有给我们代码功能,我们将根据您的功能描述。

    根据描述,你有3个功能:

    函数A

    create or replace function A(A1 in varchar2, A2 out sys_refcursor) return number is
    begin
      open A2 for select 1 from dual;
      return 2;
     end;
    

    函数B

    create or replace function B(B1 out sys_refcursor) return number is
     cur sys_refcursor;
     res_A number;
     row_ your_table_a%rowtype;
     begin
      res_A := A('',cur); 
      loop
       fetch cur into row_;
       exit when cur%notfound;
       --proccess with row A
      end loop; 
      open B1 for select 2 from dual;
      return 1;
     end;
    

    函数C

    create or replace function C() return   number is
     res_B number; 
     cur sys_refcursor;
     row_ your_table_b%rowtype;
    begin
      res_B:= B(cur);
      loop
       fetch cur into row_;
       exit when cur%notfound;
       --proccess with row B
      end loop; 
      return 2;
     end;
    

    【讨论】:

      【解决方案2】:

      也许你可以试试下面的sn-p。试图复制您在问题中提到的场景。希望这会有所帮助。

      CREATE OR REPLACE FUNCTION A_TEST(
          A1 IN VARCHAR2,
          A2 OUT sys_refcursor )
        RETURN NUMBER
      AS
        lv_num PLS_INTEGER;
      BEGIN
        NULL;
        OPEN a2 FOR SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 19;
        RETURN 1;
      END;
      
      CREATE OR REPLACE FUNCTION B_TEST
        RETURN sys_refcursor
      AS
        lv_cur sys_refcursor;
        lv_num PLS_INTEGER;
      BEGIN
        lv_num:=A_TEST('AV',lv_cur);
        RETURN lv_cur;
      END;
      
      
      
      CREATE OR REPLACE FUNCTION C_TEST
        RETURN sys_refcursor
      AS
        tab PLS_INTEGER;
        lv_cur sys_refcursor;
      BEGIN
        lv_cur:=B_TEST;
        LOOP
          FETCH lv_cur INTO tab;
          EXIT
        WHEN lv_cur%NOTFOUND;
          dbms_output.put_line(tab);
        END LOOP;
      END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        相关资源
        最近更新 更多