Oracle sqlldr TRAILING NULLCOLS requerido, pero ¿por qué?
sql-loader (5)
El problema aquí es que ha definido la ID como un campo en su archivo de datos cuando lo que desea es simplemente usar una expresión sin datos del archivo de datos. Puedes arreglar esto definiendo ID como una expresión (o una secuencia en este caso)
ID EXPRESSION "ID_SEQ.nextval"
o
ID SEQUENCE(count)
Consulte: http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234 para ver todas las opciones
Tengo un problema abstruse sqlldr que me está molestando. Mi archivo de control se ve algo como esto:
load data
infile ''txgen.dat''
into table TRANSACTION_NEW
fields terminated by "," optionally enclosed by ''"''
TRAILING NULLCOLS
( A,
B,
C,
D,
ID "ID_SEQ.NEXTVAL"
)
Los datos son algo así:
a,b,c,
a,b,,d
a,b,,
a,b,c,d
Si no coloco los NULLCOLOS DE RASTREO, aparece el error "columna no encontrada antes del final del registro lógico". Pero aunque algunas de las columnas son nulas, todas las comas están ahí, por lo que no veo una razón para que sqlldr malinterprete el archivo de entrada y no llegue al final donde genera el ID desde la secuencia de la base de datos.
Esta sintaxis ha funcionado antes sin columnas nulas: ¿por qué una columna nula hace que sqlldr no llegue a la columna generada?
Lo tengo funcionando, solo quiero entender ¿¡POR QUÉ!?!
Has definido 5 campos en tu archivo de control. Sus campos se terminan con una coma, por lo que necesita 5 comas en cada registro para los 5 campos, a menos que se especifique TRAILING NULLCOLS, aunque esté cargando el campo de ID con un valor de secuencia a través de la Cadena de SQL.
RE: Comentario de OP
Esa no es mi experiencia con una breve prueba. Con el siguiente archivo de control:
load data
infile *
into table T_new
fields terminated by "," optionally enclosed by ''"''
( A,
B,
C,
D,
ID "ID_SEQ.NEXTVAL"
)
BEGINDATA
1,1,,,
2,2,2,,
3,3,3,3,
4,4,4,4,,
,,,,,
Producido el siguiente resultado:
Table T_NEW, loaded from every logical record.
Insert option in effect for this table: INSERT
Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
A FIRST * , O(") CHARACTER
B NEXT * , O(") CHARACTER
C NEXT * , O(") CHARACTER
D NEXT * , O(") CHARACTER
ID NEXT * , O(") CHARACTER
SQL string for column : "ID_SEQ.NEXTVAL"
Record 1: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 2: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 3: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 5: Discarded - all columns null.
Table T_NEW:
1 Row successfully loaded.
3 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
1 Row not loaded because all fields were null.
Tenga en cuenta que la única fila que se cargó correctamente tenía 5 comas. Incluso la tercera fila, con todos los valores de datos presentes excepto ID, los datos no se cargan. A menos que me esté perdiendo algo ...
Estoy usando 10gR2.
Intente dar 5 '','' en cada línea, similar a la línea número 4.
La última columna del archivo de entrada debe contener algunos datos (ya sea espacio o carácter, pero no nulo). Supongo que, el primer registro contiene nulo después del último '','' que sqlldr no reconocerá a menos que se le solicite específicamente que reconozca los nulos con la opción TRAILING NULLCOLS. Alternativamente, si no desea utilizar NULLCOLOS DE TRAILING, tendrá que cuidar esos NULL antes de pasar el archivo a sqlldr. Espero que esto ayude
Tuve un problema similar cuando tuve muchos registros adicionales en el archivo csv con valores vacíos. Si abro el archivo csv en el bloc de notas, las líneas vacías tienen este aspecto: ,,,, ,,,, ,,,,,,,
No puedes verlos si están abiertos en Excel. Por favor verifique en el Bloc de notas y borre esos registros