1
我有一個使用臨時表的過程。我想擺脫臨時表並使用集合來刪除I/O。它有大約5000條記錄。如何將全局臨時錶轉換爲Oracle過程中的集合/類型
我想將數據插入到這個集合,然後我要訪問的集合,如:
select * from table(my_type_for_gtt)
我找不到這樣的一個例子。我很困惑,我是否必須先創建一個記錄類型,然後創建爲表格?
有人可以展示一個小例子嗎?
我有一個使用臨時表的過程。我想擺脫臨時表並使用集合來刪除I/O。它有大約5000條記錄。如何將全局臨時錶轉換爲Oracle過程中的集合/類型
我想將數據插入到這個集合,然後我要訪問的集合,如:
select * from table(my_type_for_gtt)
我找不到這樣的一個例子。我很困惑,我是否必須先創建一個記錄類型,然後創建爲表格?
有人可以展示一個小例子嗎?
你在正確的方向正朝着 - 首先創建類型
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;
的[如何避免Oracle全球臨時表]可能重複(http://stackoverflow.com/questions/2918466/ways-to-avoid-global-temp-tables-in-oracle) – APC 2010-07-14 23:05:18
檢查出我回答這個以前的問題:http://stackoverflow.com/questions/2918466/ways-to-avoid-global-temp-tables-in-oracle/2918935#2918935 – APC 2010-07-14 23:23:07
我已經傾倒了一個快速收藏的例子下面,儘管它重複了你更詳細的答案。希望OP能夠關閉這個問題。 – JulesLt 2010-07-15 08:26:50