2010-07-14 62 views
1

我有一個使用臨時表的過程。我想擺脫臨時表並使用集合來刪除I/O。它有大約5000條記錄。如何將全局臨時錶轉換爲Oracle過程中的集合/類型

我想將數據插入到這個集合,然後我要訪問的集合,如:

select * from table(my_type_for_gtt)

我找不到這樣的一個例子。我很困惑,我是否必須先創建一個記錄類型,然後創建爲表格?

有人可以展示一個小例子嗎?

+0

的[如何避免Oracle全球臨時表]可能重複(http://stackoverflow.com/questions/2918466/ways-to-avoid-global-temp-tables-in-oracle) – APC 2010-07-14 23:05:18

+0

檢查出我回答這個以前的問題:http://stackoverflow.com/questions/2918466/ways-to-avoid-global-temp-tables-in-oracle/2918935#2918935 – APC 2010-07-14 23:23:07

+0

我已經傾倒了一個快速收藏的例子下面,儘管它重複了你更詳細的答案。希望OP能夠關閉這個問題。 – JulesLt 2010-07-15 08:26:50

回答

2

你在正確的方向正朝着 - 首先創建類型

CREATE TYPE myEntry 
AS 
OBJECT 
    (attr1 NUMBER, 
    attr2 VARCHAR2(20) 
); 

CREATE TYPE myCollection AS TABLE OF myEntry; 

下一頁一些例子功能回到您的收藏

CREATE OR REPLACE FUNCTION ExampleMyCollection1 
RETURN myCollection 
IS 
    lCol myCollection := myCollection(); /* Must initialise empty collection */ 
BEGIN 
    lCol.EXTEND(1000); 
    /* Populate the collection entries with objects */ 
    FOR i IN 1..1000 LOOP 
     lCol(i) := myEntry(i,'An entry for '||i); 
    END LOOP; 
    RETURN lCol; 
END ExampleMyCollection1; 

SELECT * FROM TABLE(ExampleMyCollection1); 

變化的「行」 - 這一次,我們使用管道,所以結果將在創建時返回到查詢中。請注意,儘管是一個函數,但對於PIPELINED函數沒有結束RETURN。

CREATE OR REPLACE FUNCTION ExampleMyCollection2 
RETURN myCollection PIPELINED 
IS 
BEGIN 
    FOR i IN 1..1000 LOOP 
     PIPE ROW(myEntry(i,'An entry for '||i)); 
    END LOOP; 
END ExampleMyCollection2; 

SELECT * FROM TABLE(ExampleMyCollection2); 

要使用純內存中的數據替換你的臨時表,你將需要一些東西來存儲您的收藏 - 即具有狀態的包。

CREATE OR REPLACE PACKAGE pMyCollection 
AS 
    PROCEDURE AddEntry(entry IN myEntry); 

    FUNCTION fCurrentCollection RETURN myCollection; 

    PROCEDURE ClearEntries; 

END pMyCollection; 

CREATE OR REPLACE PACKAGE BODY pMyCollection 
AS 
    /* Stateful variable to hold the collection */ 
    pCollection myCollection := myCollection(); 

    PROCEDURE AddEntry(entry IN myEntry) 
    IS 
    BEGIN 
     pCollection.EXTEND; 
     pCollection(pCollection.LAST) := entry; 
    END; 

    PROCEDURE ClearEntries 
    IS 
    BEGIN 
     pCollection.DELETE; 
    END ClearEntries; 

    FUNCTION fCurrentCollection 
    RETURN myCollection 
    IS 
    BEGIN 
     /* Return whole collection - we could use pipelining and parameters to return partial elements */ 
     RETURN pCollection; 
    END fCurrentCollection; 

END pMyCollection;