2009-04-01 8 views
5

Tabelle T1 Struktur: spalte1 Nummer, Col2 NummerSQL Loader: Laden in 2 Tabellen 1 Steuerdatei und 1 CSV

Tabelle T2 Struktur: spalte1 Nummer, Col2 Nummer, col3 Nummer

CSV-Datei:

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

ich möchte Daten in der Tabelle T1 als:

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

ich möchte Daten in der Tabelle T2 als:

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

folgende Steuerdatei funktioniert nicht

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 

Bitte helfen Sie mir, dieses Problem zu lösen.

+0

welche Version von SQL ist das? fügen Sie ein Tag bitte –

+0

Bitte akzeptieren Sie jede Antwort, wenn es Ihr Problem löst ... Es wird anderen helfen ... –

Antwort

0

Versuchen Sie folgendes:

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

Tut mir leid, es funktioniert nicht –

+0

Was sagt es? – Quassnoi

+0

siehe meine Antwort (unten und hoffentlich bald oben). Mehrere INTO-Klauseln erfordern, dass Sie den logischen Zeiger zurücksetzen müssen - ansonsten sehen Sie, dass 4,5,6 in t2 geht. Ein Befehl position() setzt den Zeiger zurück. Aus diesem Grund ist es immer einfacher, Positionsdaten in mehrere Tabellen zu laden. –

2

funktionierts aber ich diese Lösung nicht mögen. Ich bevorzuge in diesen Situationen externe Tabellen. Die kurze Antwort ist, dass Sie Probleme hatten, weil SQLLDR die Daten bei mehreren Zeilenimporten nicht automatisch erneut durchsucht. Ein Ausschnitt aus der Dokumentation folgt.

From the SQLLDR documentation

POSITION Verwendung mit mehreren Tabellenlasten

In einer mehr Tabellenlast, geben Sie mehrere Klauseln Tabelle in. Wenn Sie POSITION () für die erste Spalte der ersten Tabelle angeben, wird die Position relativ zum Anfang des logischen Datensatzes berechnet. Wenn Sie POSITION () für die erste Spalte der nachfolgenden Tabellen angeben, wird die Position relativ zur letzten Spalte der zuletzt geladenen Tabelle berechnet.

Wenn also eine nachfolgende INTO TABLE-Klausel beginnt, wird die Position nicht automatisch auf den Anfang des logischen Datensatzes gesetzt. Dadurch können mehrere INTO TABLE-Klauseln unterschiedliche Teile desselben physischen Datensatzes verarbeiten. Ein Beispiel finden Sie unter Extrahieren mehrerer logischer Datensätze.

Ein logischer Datensatz enthält möglicherweise Daten für eine von zwei Tabellen, aber nicht für beide. In diesem Fall würden Sie POSITION zurücksetzen. Anstatt die Positionsangabe wegzulassen oder POSITION (* + n) für das erste Feld in der INTO TABLE-Klausel zu verwenden, verwenden Sie POSITION (1) oder 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

Danke Neil +1 für Ihren detaillierten Code und speziell für col1 Position (1) –

2

Versuchen Sie, diese

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|