2011-12-09 19 views
6

Non ho familiarità con PLSQL, tuttavia devo eseguire un inserimento di massa per un'attività.oracle bulk insert

Fondamentalmente devo interrogare la tabella uno per ottenere una colonna e quindi usarla su una tabella diversa per inserirla. Qualcosa di simile a questo:

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') 
} 

Ora, ho intorno 4k + id nel file e ogni ID avrei diversa gamma di col1 distinte: massima: 165 milioni, min ~ 2k

sto cercando di raggiungere questo obiettivo "Leggi da una tabella e incollarli in un'altra inserimento di massa utilizzando", è bene se questo viene eseguito durante la notte ecc

ho ottenuto questo script da qualche ricerca online:

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; 

I penso che questo potrebbe essere utile nel mio caso, ma non capisco abbastanza la semantica. Dove menziono column1 ... anche per i valori inseriti sono espressi come ObjectTable $ (x) all'inizio dei valori (.., .., ..).

Qualcuno può spiegarmi lo script e aiutarmi a modificarlo nel mio caso d'uso usando le variabili table1, table2, col1, ids etc che ho citato nel mio esempio.

Il DB è 10g

Grazie!

+0

cosa è "gamma di col1 distinte: massima: 165 milioni, min ~ 2k" suppone significare? Descrivere meglio le colonne di table1 e table2. – Codo

risposta

5

Non è necessario il ritiro complessivo. Diamine, non hai nemmeno bisogno di PL/SQL - SQL può fare anche l'inserimento di massa!

semplicemente creare una vista che corrisponde al rowtype% della vostra tabella di destinazione

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 
) 

poi

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