2013-04-25 46 views
0

如果從表B中將數據插入到表A中,並且在選擇數據時選擇了數據,substr,instr,trunc函數可用於獲取的列,那麼可以執行批量收集嗎?Bulk Collect Oracle

INSERT INTO A 
SELECT 
DISTINCT 
    SUBSTR(b.component, 1, INSTR(b.component, ':', 1) - 1), 
    TRUNC(c.end_dt, 'DDD'), 
FROM 
    B b, 
    C c 
WHERE 
    TRUNC(c.end_dt)=TRUNC(b.last_Date, 'DDD') ; 

如何使用批量收集將數據插入到表A中?

+1

批量收集旨在改進過程逐行處理的性能。但是你已經有了一個SQL解決方案,這幾乎總是最好的方法。 – 2013-04-25 18:55:45

+1

不要在這種情況下使用批量收集,你已經盡力做到最好(留在sql引擎中是最好的)。另外,除非你確定你有適當的函數索引,否則不要儘可能地限制日期。 – Sebas 2013-04-25 19:43:46

回答

1

當您絕對需要處理/插入塊的行時,您將使用Bulk Collect和FORALL插入行的唯一原因。否則,總是使用SQL。

DECLARE 
    CURSOR c_data IS 
    SELECT * FROM source_tab; 
-- 
    TYPE t_source_tab IS TABLE OF source_tab%ROWTYPE; 
    l_tab t_source_tab; 
    v_limit NUMBER:= 1000; 
BEGIN 
    OPEN c_data; 
    LOOP 
    FETCH c_data BULK COLLECT INTO l_tab LIMIT v_limit; 
    EXIT WHEN l_tab.count = 0; 
    -- Insert --  
    FORALL i IN l_tab.first .. l_tab.last 
     INSERT INTO destination_tab VALUES l_tab(i); 
     COMMIT; 

     -- prints number of rows processed -- 
     DBMS_OUTPUT.PUT_LINE ('Inserted ' || SQL%ROWCOUNT || ' rows:'); 

    -- Print nested table of records - optional. 
    -- May overflow the buffer and slow down the performance if you process many rows. 
    -- Use for testing only and limit the rows with Rownum or Row_Number() in cursor query: 
    FOR i IN l_tab.FIRST..l_tab.LAST -- or l_tab.COUNT 
    LOOP 
     DBMS_OUTPUT.PUT_LINE (l_tab(i).hire_date ||chr(9)||l_tab(i).last_name ||chr(9)||l_tab(i).first_name); 
    END LOOP;  

END LOOP; 
CLOSE c_data; 
END 
/