从另一个PLSQL函数调用ref_游标

从另一个PLSQL函数调用ref_游标,plsql,ref-cursor,Plsql,Ref Cursor,我有三个PLSQL函数:A、B和C 这个想法是这样的:C呼叫B,B呼叫A 函数A在被B调用时,返回一个数值作为状态指示器,返回一个带有表格结果的参考光标。 例如,函数A(A1在varchar2中,A2在sys\U refcursor中)返回编号 函数B从A接收结果时,预期会在将结果传递给C之前重新格式化结果,同样以ref游标的形式 A是一个现有功能,不能修改,而B和C将是全新的功能 问题是,如何从数据库中获取ref游标?我能够获取函数(即状态指示器)返回的数值,但从A获取ref游标的结果时遇

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

这个想法是这样的:C呼叫B,B呼叫A

  • 函数A在被B调用时,返回一个数值作为状态指示器,返回一个带有表格结果的参考光标。 例如,函数A(A1在varchar2中,A2在sys\U refcursor中)返回编号

  • 函数B从A接收结果时,预期会在将结果传递给C之前重新格式化结果,同样以ref游标的形式

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

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

  • 如果我从B调用A,是否可以假定A的ref游标已自动打开

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

  • p/S.我的编程经验非常有限,我对PLSQL只有几个月的新经验


    如果您有任何提示,我们将不胜感激。

    由于您尚未向我们提供代码函数,我们将根据您的函数描述进行讨论

    根据描述,您有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;
    
    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;
    
    功能B

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

    由于您尚未向我们提供代码函数,我们将根据您的函数描述进行讨论

    根据描述,您有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;
    
    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;
    
    功能B

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

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

    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;
    
    创建或替换函数A\u测试(
    VARCHAR2中的A1,
    A2输出系统(参考光标)
    返回号码
    作为
    lv_num PLS_整数;
    开始
    无效的
    打开a2从双连接中选择级别,级别<19;
    返回1;
    结束;
    创建或替换功能B_测试
    返回系统参考光标
    作为
    lv_cur sys_refcursor;
    lv_num PLS_整数;
    开始
    lv_num:=A_测试('AV',lv_cur);
    返回lv_cur;
    结束;
    创建或替换功能C_测试
    返回系统参考光标
    作为
    tab PLS_整数;
    lv_cur sys_refcursor;
    开始
    lv_cur:=B_试验;
    环
    将lv_cur提取到选项卡中;
    出口
    当未找到lv_cur%时;
    dbms_output.put_行(tab);
    端环;
    结束;
    
    也许你可以试试下面的代码片段。试图复制您在问题中提到的场景。希望这有帮助

    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;
    
    创建或替换函数A\u测试(
    VARCHAR2中的A1,
    A2输出系统(参考光标)
    返回号码
    作为
    lv_num PLS_整数;
    开始
    无效的
    打开a2从双连接中选择级别,级别<19;
    返回1;
    结束;
    创建或替换功能B_测试
    返回系统参考光标
    作为
    lv_cur sys_refcursor;
    lv_num PLS_整数;
    开始
    lv_num:=A_测试('AV',lv_cur);
    返回lv_cur;
    结束;
    创建或替换功能C_测试
    返回系统参考光标
    作为
    tab PLS_整数;
    lv_cur sys_refcursor;
    开始
    lv_cur:=B_试验;
    环
    将lv_cur提取到选项卡中;
    出口
    当未找到lv_cur%时;
    dbms_output.put_行(tab);
    端环;
    结束;