2009-04-01 18 views
5

Tabella T1 Struttura: Numero col1, numero col2SQL Loader: caricare in 2 Tabelle da 1 controlfile e 1 CSV

Tabella T2 Struttura: Numero col1, numero col2, numero col3

csv:

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

voglio i dati nella tabella T1 come:

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

voglio i dati nella tabella T2 come:

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

seguente file di controllo non funziona

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 

favore mi aiuti a risolvere questo problema.

+0

quale versione di SQL è questo? aggiungi un tag per favore –

+0

Si prega di accettare qualsiasi risposta se risolve il tuo problema .. Aiuterà gli altri ... –

risposta

0

Prova questo:

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

scusa non funziona –

+0

Cosa vuol dire? – Quassnoi

+0

vedi la mia risposta (sotto e spero presto di essere sopra). Più clausole INTO richiedono il reset del puntatore logico, altrimenti vedi 4,5,6 entrare in t2. Un comando position() resetterà il puntatore. È sempre più facile caricare i dati posizionali in più tabelle, proprio per questo motivo. –

2

Ciò lavoro, ma non mi piace questa soluzione. Preferisco usare tabelle esterne in queste situazioni. La risposta breve è che si riscontrano problemi poiché SQLLDR non esegue automaticamente la scansione dei dati su più importazioni di righe. Segue un frammento della documentazione.

From the SQLLDR documentation

Utilizzando POSIZIONE con carichi multipli Tabella

In un carico più tabelle, si specificano più clausole tabella in. Quando si specifica POSITION () per la prima colonna della prima tabella, la posizione viene calcolata rispetto all'inizio del record logico. Quando si specifica POSIZIONE () per la prima colonna di tabelle successive, la posizione viene calcolata rispetto all'ultima colonna dell'ultima tabella caricata.

Pertanto, quando inizia una successiva clausola INTO TABLE, la posizione non viene impostata automaticamente all'inizio del record logico. Ciò consente a più clausole INTO TABLE di elaborare parti diverse della stessa registrazione fisica. Per un esempio, vedere Estrazione di più record logici.

Un record logico può contenere dati per una delle due tabelle, ma non entrambe. In questo caso, si ripristinerebbe POSITION. Invece di omettere le specifiche di posizione o utilizzare POSITION (* + n) per il primo campo nella clausola INTO TABLE, utilizzare POSITION (1) o 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

Grazie a Neil +1 per il codice dettagliato e in particolare per la posizione col1 (1) –

2

Prova questa

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| 
Problemi correlati