2012-04-30 66 views
8

Tengo un archivo de control de la cargadora SQL,Error del cargador SQL: "El campo de longitud variable excede la longitud máxima".

LOAD DATA 
INFILE 'test.txt' 
INTO TABLE TEST replace 
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS 
(DOCUMENTID INTEGER(10), 
    CUSTID INTEGER(10), 
    USERID INTEGER(10), 
    FILENAME VARCHAR(255), 
    LABEL VARCHAR(50), 
    DESCRIPTION VARCHAR(2000), 
    POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="", 
    USERFILENAME VARCHAR(50), 
    STORAGEPATH VARCHAR(255) 
) 

y me está dando un error cuando corro cargador SQL en él,
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

Aquí es esa fila .. la longitud de esa columna es la forma bajo 255 ..

1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||

Y aquí es una rareza me di cuenta en el archivo de registro

Column Name | Position | Len | Term | Encl | Datatype
FILENAME | NEXT | 257 | | | VARCHAR

que definen la longitud que 255 tanto en mi mesa y archivo de control. Sin embargo, el registro lo escupe como 257? Intenté reducir la longitud en el archivo de control a 253, por lo que aparece como 255 en el archivo de registro, pero el mismo problema.

¿Algún ayuda? Esto me ha molestado por dos días.

Gracias.

Respuesta

13

No defina sus campos de datos como VARCHAR2 e INTEGER. Use CHAR. La mayoría de las veces, al cargar datos de un archivo de texto, desea utilizar CHAR, o quizás DATE, aunque incluso eso se convierte a partir de un formulario de texto. La mayoría de las veces ni siquiera necesita un especificador de longitud. La longitud predeterminada de un campo CHAR es de 255. Su archivo de control debe ser algo como:

LOAD DATA 
INFILE 'test.txt' 
INTO TABLE TEST replace 
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS 
(DOCUMENTID, 
CUSTID, 
USERID , 
FILENAME, 
LABEL, 
DESCRIPTION CHAR(2000), 
POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="", 
USERFILENAME, 
STORAGEPATH) 
+1

Y ... eso fue todo. Especificar longitudes con char tampoco lo hacía por mí, pero lo que publicaste funcionó perfectamente. ¡Gracias! – tjsimmons

5

+1 para DCookie, sino para ampliar el que es importante distinguir entre tipos de datos como se especifica en una tabla de datos y tipos en un archivo de control de cargador SQL * ya que significan cosas bastante diferentes, confusamente.

Comience con un vistazo al documentation, y tenga en cuenta que al cargar archivos de texto normales, debe utilizar los tipos de datos "portátiles".

Varchar es un tipo "no portátil", en los cuales:

... consists of a binary length subfield followed by a character string of the specified length

Así como dice DCookie, char es lo que hay que ir, y entera externa es un * Tipo de cargador de datos SQL muy utilizada que probablemente desee especificar para DOCUMENTID etc.

+1

Gracias! También lo tendré en cuenta. No me di cuenta de que eran dos cosas separadas. Supuse que deberían ser matemáticas. El subcampo de longitud binaria + longitud especificada explica por qué 255 se convirtió en 257, también. – tjsimmons

+1

+1, estoy de acuerdo con David aquí. La distinción entre las especificaciones de tipo de archivo de control del Cargador SQL y las especificaciones en las tablas mismas siempre parece confundir a las personas. No creo haber usado nada además de CHAR y DATE en el archivo de control. – DCookie

+0

Por cierto, ¿sabe por qué hay estos tipos diferentes en archivos y tablas de control? – ady

Cuestiones relacionadas