2011-12-09 4 views
6

Je ne suis pas familier avec PLSQL, mais je dois effectuer une insertion en bloc pour une tâche.oracle bulk insert

Fondamentalement, je dois interroger la première table pour obtenir une colonne et ensuite l'utiliser sur une table différente pour l'insérer. Quelque chose comme ceci:

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

Maintenant, je autour de 4k + ids dans le fichier et chaque identifiant aurais différentes gammes de col1 distinctes: Max: 165 millions, min ~ 2k

Je suis en train de réaliser cet « Lire d'une table et l'insérer dans un autre à l'aide d'insertion en vrac », il est correct si cela va du jour au lendemain, etc.

Je suis arrivé ce script en ligne de certains de recherche:

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 pense que cela pourrait être utile dans mon cas, mais je ne comprends pas très bien la sémantique. Où est-ce que je mentionne column1 ... aussi pour les valeurs d'insertion sont exprimés comme ObjectTable $ (x) insetead de valeurs (.., .., ..). Est-ce que quelqu'un peut m'expliquer le script et m'aider à le modifier dans mon cas d'utilisation en utilisant les variables table1, table2, col1, ids etc. que j'ai mentionnées dans mon exemple. Le DB est 10g

Merci!

+0

Ce qui est "gamme de col1 distincts: Max: 165 millions, min ~ 2k" censé signifier? Veuillez mieux décrire les colonnes de table1 et table2. – Codo

Répondre

5

Vous n'avez pas du tout besoin de la collecte en bloc. Heck, vous n'avez même pas besoin de PL/SQL - SQL peut faire l'insertion en vrac aussi bien!

simplement créer une vue qui correspond à la% rowtype de votre table cible

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 
) 

puis

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