2009-04-01 11 views
5

Tableau T1 Structure: nombre col1, numéro col2Loader SQL: Charger dans les 2 tableaux de 1 controlfile et 1 CSV

Tableau T2 Structure: nombre col1, numéro col2, numéro col3

fichier CSV:

row1:1,2,3,4,5,6 
row2:1,2,3,4,5,6 

Je veux données dans le tableau T1 que:

col1 col2 
===== ==== 
1  3 
1  3 

Je veux données dans le tableau T2 que:

col1 col2 col3 
===== ==== ==== 
1  3  5 
1  3  5 

fichier de contrôle suivant ne fonctionne pas

load data 
infile * 
insert into table T1 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill1 filler,col2) 
insert into table T2 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill2 filler,col2,fill3 filler,col3) 
begindata 
1,2,3,4,5,6 
1,2,3,4,5,6 

S'il vous plaît aidez-moi à résoudre ce problème.

+0

quelle version de SQL est-ce? ajouter une étiquette s'il vous plaît –

+0

S'il vous plaît accepter toute réponse si elle résout votre problème .. Il aidera les autres ... –

Répondre

0

Essayez ceci:

LOAD DATA 
INFILE * 
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER) 
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER) 
BEGINDATA 
1,2,3,4,5,6 
1,2,3,4,5,6 
+0

désolé, il ne fonctionne pas –

+0

Que dit-il? – Quassnoi

+0

voir ma réponse (ci-dessous et j'espère bientôt être au-dessus). Plusieurs clauses INTO vous demandent de réinitialiser le pointeur logique. Dans le cas contraire, passez à l'étape 4, 5, 6. Une commande position() réinitialisera le pointeur. Il est toujours plus facile de charger des données positionnelles dans plusieurs tables, pour cette raison. –

2

Cela ne fonctionne, mais je n'aime pas cette solution. Je préfère utiliser des tables externes dans ces situations. La réponse courte est que vous aviez des problèmes car SQLLDR ne re-scanne pas automatiquement les données sur les importations de plusieurs lignes. Un extrait de la documentation suit.

From the SQLLDR documentation

Utiliser POSITION avec plusieurs charges Tableau

Dans une charge de plusieurs tables, vous spécifiez plusieurs clauses INTO TABLE. Lorsque vous spécifiez POSITION () pour la première colonne de la première table, la position est calculée par rapport au début de l'enregistrement logique. Lorsque vous spécifiez POSITION () pour la première colonne des tables suivantes, la position est calculée par rapport à la dernière colonne de la dernière table chargée.

Ainsi, lorsqu'une clause INTO TABLE suivante commence, la position n'est pas automatiquement définie au début de l'enregistrement logique. Cela permet à plusieurs clauses INTO TABLE de traiter différentes parties du même enregistrement physique. Pour un exemple, voir Extraction de plusieurs enregistrements logiques.

Un enregistrement logique peut contenir des données pour l'une des deux tables, mais pas les deux. Dans ce cas, vous réinitialiseriez POSITION. Au lieu d'omettre la spécification de position ou d'utiliser POSITION (* + n) pour le premier champ de la clause INTO TABLE, utilisez POSITION (1) ou POSITION (n).

load data 
    infile * 
    truncate 
    into table T1 
    fields terminated by ',' trailing nullcols 
    (col1 
    , fill1 filler 
    , col2 ) 
    into table T2 
    fields terminated by ',' trailing nullcols 
    (col1 position(1) 
    , filler filler 
    , col2  
    , filler2 filler 
    , col3) 

BEGINDATA 
1,2,3,4,5,6 
1,2,3,4,5,6 

SQL> select * From t1; 

     COL1  COL2 
---------- ---------- 
     1   3 
     1   3 

SQL> select* From t2; 

     COL1  COL2  COL3 
---------- ---------- ---------- 
     1   3   5 
     1   3   5 
+0

Merci Neil +1 pour votre code détaillé et spécialement pour la position col1 (1) –

2

Essayez cette

LOAD DATA 
INFILE * "STR '|EndRec|'" 
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER) 
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1 POSITION(1), FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER) 

BEGINDATA 
1,2,3,4,5,6|EndRec|1,2,3,4,5,6|EndRec|