2009-04-01 6 views
5

Tabla T1 Estructura: número col1, número col2cargador del SQL: Cargar en 2 Tablas de 1 controlfile y 1 CSV

estructura de tabla T2: Número col1, número col2, número col3

archivo csv:

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

Quiero datos de la Tabla T1 como:

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

Quiero datos de la Tabla T2 como:

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

siguiente archivo de control no está funcionando

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 

favor me ayude a resolver este problema.

+0

qué versión de SQL es esto? agregar una etiqueta –

+0

Por favor, acepte cualquier respuesta si resuelve su problema ... Ayudará a los demás ... –

Respuesta

0

Prueba esto:

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

lo siento, no está funcionando –

+0

¿Qué dice? – Quassnoi

+0

ver mi respuesta (a continuación y espero que pronto sea más arriba). Múltiples cláusulas INTO requieren que restablezca el puntero lógico; de lo contrario, verá 4,5,6 entrar en t2. Un comando de posición() reiniciará el puntero. Siempre es más fácil cargar datos posicionales en múltiples tablas, por esta misma razón. –

2

Esto funciona, pero no me gusta esta solución. Prefiero usar tablas externas en estas situaciones. La respuesta breve es que estaba teniendo problemas porque SQLLDR no vuelve a escanear automáticamente los datos en las importaciones de múltiples filas. Un fragmento de la documentación sigue.

From the SQLLDR documentation

utilizando la posición con cargas de múltiples tablas

En una mesa de carga múltiple, se especifican diversas cláusulas tabla en. Cuando especifica POSICIÓN () para la primera columna de la primera tabla, la posición se calcula con relación al comienzo del registro lógico. Cuando especifica POSICIÓN () para la primera columna de tablas posteriores, la posición se calcula con relación a la última columna de la última tabla cargada.

Por lo tanto, cuando comienza una cláusula INTO TABLE posterior, la posición no se establece automáticamente al comienzo del registro lógico. Esto permite que múltiples cláusulas INTO TABLE procesen diferentes partes del mismo registro físico. Para ver un ejemplo, consulte Extracción de múltiples registros lógicos.

Un registro lógico puede contener datos para una de dos tablas, pero no para ambas. En este caso, restablecería la POSICIÓN. En lugar de omitir la especificación de posición o usar POSITION (* + n) para el primer campo en la cláusula INTO TABLE, use 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

Gracias Neil +1 por su código detallado y especialmente por la posición col1 (1) –

2

probar este

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| 
Cuestiones relacionadas