2012-02-10 51 views
3

我有一個TDATAMAP表,它擁有大約1000萬條記錄,我想將所有記錄提取到一個PL/SQL表類型變量中,並將其與一些條件匹配,並最終將所有需要的記錄插入到一​​個登臺表中。請告訴我,如果它可能使用PL/SQL表的類型變量和BULK INSERT/COLLECT。我也關心代碼的性能。如何將數據插入到PL/SQL表類型而不是PL/SQL表中?

+0

你是指什麼「完全符合一些標準」?我認爲有一種更好的方式來做你想做的事,但沒有足夠的信息來說明。你能給一些示例代碼嗎? – tbone 2012-02-10 12:12:30

回答

7

只要有足夠的內存來保存那麼多,你可以,但你可能不應該一次加載1000萬條記錄到內存中。通常BULK COLLECT與LIMIT子句一起使用以一次處理有限數量的行,例如, 1000

documentation

的BULK COLLECT子句允許您從結果 集,或整個結果集一次獲取整個列。下面的例子中,從 光標檢索列到收集:

DECLARE 
    TYPE NameList IS TABLE OF emp.ename%TYPE; 
    names NameList; 
    CURSOR c1 IS SELECT ename FROM emp WHERE job = 'CLERK'; 
BEGIN 
    OPEN c1; 
    FETCH c1 BULK COLLECT INTO names; 
    ... 
    CLOSE c1; 
END; 

以下示例使用LIMIT子句。對於循環的每次迭代 ,FETCH語句會將100行(或更少)讀取到索引 表acct_ids中。以前的值被覆蓋。

DECLARE 
    TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; 
    CURSOR c1 IS SELECT acct_id FROM accounts; 
    acct_ids NumList; 
    rows NATURAL := 100; -- set limit 
BEGIN 
    OPEN c1; 
    LOOP 
     /* The following statement fetches 100 rows (or less). */ 
     FETCH c1 BULK COLLECT INTO acct_ids LIMIT rows; 
     EXIT WHEN c1%NOTFOUND; 
     ... 
    END LOOP; 
    CLOSE c1; 
END; 
8

「我希望所有的記錄讀取到PL/SQL表類型變量, 一些標準的比賽,並最終在一個臨時表中插入所有需要的 記錄。」

這可能不是正確的做法。 SQL是基於集合的編程語言的。它具有使我們能夠識別和處理我們想要的一組記錄的功能。

因此,而不是一個三個階段的過程 - 提取物,過濾器,插入 - 慶祝套的喜悅:

insert into your_staging_table 
select whatver 
from your_10m_table 
where something = your_matching_criteria; 

會有場景時,這是不夠好。但這是開始的方法。