2012-04-05 103 views
3

我有一個存儲過程與下面的基本佈局,作爲結果集返回一個sys_refcursor。 (從技術上講,它重新啓動了四個,但爲了清晰起見,我只說一個)。結果集是從臨時表中選擇的。如何從一個存儲過程中從SYS_REFCURSOR中獲取數據並在另一個存儲過程中使用它?

procedure aProcedure 
(C1 in out sys_refcursor 
) is 
begin 
--populate Temp_Table here with a stored proc call; 
OPEN C1 FOR 
SELECT Cols 
FROM TEMP_TABLE; 

我需要使用不同的存儲過程將此結果集從C1插入到永久表中。這是否可行或是否需要重新構建結果集?

我已經能夠找到有關使用Oracle以外的遊標和結果集的信息,但不能在其內部使用它們。

我知道從第一個存儲過程插入數據是有意義的,但這並不是我真正需要的。這是一個可選的要求,永久保存結果集。

感謝您的任何有用的信息。

+0

爲什麼你需要在2個過程中做到這一點?爲什麼不是1? – Ben 2012-04-05 19:44:16

回答

11

假設調用者知道aProcedure正在打開的光標的結構,可以這樣做。

declare 
    l_rc sys_refcursor; 
    l_rec temp_table%rowtype; 
begin 
    aProcedure(l_rc); 
    loop 
    fetch l_rc 
    into l_rec; 
    exit when l_rc%notfound; 

    dbms_output.put_line(l_rec.col1); 
    end loop; 
    close l_rc; 
end; 
/

如果無法讀取到記錄類型,也可以讀取到其他一些標局部變量(數量和類型必須匹配列的數量和類型aProcedure指定其SELECT的列表)。在我的情況下,我定義了aProcedure返回兩個數字列

declare 
    l_rc sys_refcursor; 
    l_col1 number; 
    l_col2 number; 
begin 
    aProcedure(l_rc); 
    loop 
    fetch l_rc 
    into l_col1, l_col2; 
    exit when l_rc%notfound; 
    dbms_output.put_line(l_col1); 
    end loop; 
    close l_rc; 
end; 
+0

感謝您花時間回答賈斯廷這個問題。這很有道理,儘管我有四個不同的遊標從兩個臨時表中生成數據,還有一個視圖需要收集並插入到一個不同的表中。它會讓我的新生大腦有一段時間來正確實施它。這絕對是讓我朝着正確的方向發展。 – dee 2012-04-10 14:55:29

相關問題