从另一个PLSQL函数调用ref_cursor

时间:2016-03-28 10:38:17

标签: plsql ref-cursor

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

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

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

  • 当函数B收到来自A的结果时,预期会重新格式化结果,然后再将它们传递给C,也是以引用光标的形式。

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

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

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

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

  3. P / S。我的编程经验非常有限,而且在PLSQL中只有几个月的时间。

    任何提示都将非常感激。

2 个答案:

答案 0 :(得分:0)

由于您尚未向我们提供代码功能,因此我们将基于您的功能描述。

根据说明,您有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;

答案 1 :(得分:0)

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

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;