2011-12-09 246 views
6

我不熟悉PLSQL,但是我必須爲任務執行批量插入操作。oracle批量插入

基本上我必須查詢表一得到一列,然後在不同的表上使用它來插入它。事情是這樣的:

for (ids in a file As cur_id) 
{ 
Select DISTINCT column1 As col1_list from table1 where id=cur_id 

for (cols in col1_list as cur_col) 
    Insert into table2 values ('cur_id','cur_col','214','234','first 3 chars of cur_col') 
} 

現在,我已經在文件中圍繞4K + IDS和每個ID將有不同幅度的不同COL1的:最高:1.65億,分〜2K

我試圖做到這一點「從一個表讀取並插入到其他使用批量插入」,它是好的,如果這一夜運行等

我拿到這個劇本從一些研究在線:

CREATE OR REPLACE PROCEDURE test_proc 
IS 
TYPE TObjectTable IS TABLE OF ALL_OBJECTS%ROWTYPE; 
ObjectTable$ TObjectTable; 

BEGIN 
    SELECT * BULK COLLECT INTO ObjectTable$ 
    FROM ALL_OBJECTS; 

    FORALL x in ObjectTable$.First..ObjectTable$.Last 
    INSERT INTO t1 VALUES ObjectTable$(x) ; 
END; 

我認爲這可能對我有用,但我不太瞭解語義。我在哪裏提到column1 ...也用於插入值表示爲ObjectTable $(x)而不是值(..,..,..)。

有人可以向我解釋腳本,並幫助我使用我在示例中提到的table1,table2,col1,ids等變量將其修改爲我的用例。

該數據庫爲10g

謝謝!

+0

什麼 「不同COL1的範圍:最高:1.65億,分〜2K」 一致的觀點應該意思?請更好地描述table1和table2的列。 – Codo

回答

5

根本不需要批量收集。哎呀,你甚至不需要PL/SQL - SQL也可以做批量插入!

只需創建目標表的%ROWTYPE

create view v_Table1_Table2 as 
(select id, 
      max(case when /* condition for column1 */ 
        then /* expression for column1 */ 
        else null; 
       end) as column1, 
      max(case when /* condition for column2 */ 
        then /* expression for column2 */ 
        else null; 
       end) as column2, 
      max(case when /* condition for column3 */ 
        then /* expression for column3 */ 
        else null; 
       end) as column3 
    from  table1 
    group by id 
) 

然後

insert into table2 (select * from v_Table1_Table2 where id = :cur_id);