2011-12-09 15 views
6

No estoy familiarizado con PLSQL, pero tengo que realizar una inserción masiva para una tarea.oráculo bulk insert

Básicamente tengo que consultar la tabla uno para obtener una columna y luego usarla en una tabla diferente para insertarla. Algo como esto:

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

Ahora, tengo alrededor de 4k + ID en el archivo y cada ID tendría diferente gama de distinta col1: Max: 165 millones de dólares, min ~ 2k

que estoy tratando de lograr este "Leer de una tabla e insertar en otra mediante inserción masiva", que está bien si esto se ejecuta durante la noche, etc.

tengo este script desde una cierta investigación en línea:

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 Creo que esto podría ser útil en mi caso, pero no entiendo muy bien la semántica. ¿Dónde menciono la columna 1 ... también para los valores de inserción se expresan como ObjectTable $ (x) en lugar de valores (.., .., ..).

Por favor alguien puede explicar la secuencia de comandos para mí y ayudarme a modificar a mi caso de uso usando tabla1, tabla2, col1, ID de las variables, etc que he mencionado en mi ejemplo.

El DB 10g se

Gracias!

+0

Cuál es "gama de distinta col1: Max: 165 millones de dólares, min ~ 2k" supone ¿media? Por favor, describa mejor las columnas de table1 y table2. – Codo

Respuesta

5

No es necesario que se acumule a granel en absoluto. ¡Caramba, ni siquiera necesita PL/SQL - SQL también puede hacer la inserción masiva!

simplemente crear una vista que coincide con el tipo de fila% de su tabla de destino

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 
) 

continuación

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