2016-03-28 67 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;