2016-03-28 90 views
1

ref_cursor我有三个PLSQL功能:A,B和C.调用从另一个PLSQL功能

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

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

  • 功能B,当它从A接收到的结果,预计重新格式化结果之前将它们传递至C,也以引用游标的形式。

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

的问题是,我该如何获取从A裁判光标?我是能够得到由函数(即状态指示器)返回的数值,但我有问题,从A

  1. 获取裁判光标的结果。如果我的B调用,可以我假设A的参考游标会自动打开?

  2. 什么是合乎逻辑的步骤获得从A的参考游标的结果?例如。我可以将结果转换为对象类型吗?

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

任何提示将非常感激。

回答

0

既然你没有给我们的代码的功能,我们将根据你的函数描述。

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

功能一个

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; 

功能Ç

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