2012-04-30 18 views
8

ich eine SQL-Loader Control-Datei haben,SQL Loader Fehler: "Feld mit variabler Länge überschreitet maximale Länge."

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) 
) 

und es gibt mir einen Fehler, wenn ich SQL Loader laufen Sie darauf
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

Hier ist die Zeile .. die Länge der Spalte Art und Weise wird unter 255 ..

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

Und hier ist eine Kuriosität ich in der Protokolldatei bemerkt

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

Ich definiere die Länge als 255 sowohl in meinem Tisch und Steuerdatei. Doch das Log spuckt es als 257 aus? Ich habe versucht, die Länge in der Steuerdatei auf 253 herunterzufahren, so dass es in der Protokolldatei als 255 erscheint, aber das gleiche Problem.

Irgendwelche Hilfe? Das hat mich seit zwei Tagen gestört.

Danke.

Antwort

13

Definieren Sie Ihre Datenfelder nicht als VARCHAR2 und INTEGER. Verwende CHAR. Meistens möchten Sie beim Laden von Daten aus einer Textdatei CHAR oder DATE verwenden, auch wenn dies aus einem Textformat konvertiert wird. Die meiste Zeit brauchst du nicht einmal einen Längenbezeichner. Die Standardlänge für ein CHAR-Feld ist 255. Ihre Steuerdatei etwas aussehen soll:

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

Und das war es. Die Angabe von Längen mit Char hat es auch nicht für mich getan, aber was du gepostet hast, hat perfekt funktioniert. Vielen Dank! – tjsimmons

5

+1 für DCookie, sondern erweitert auf, dass es wichtig zwischen Datentypen zu unterscheiden, wie in einer Tabelle und Datentypen angegeben in einer SQL * -Loader-Steuerdatei, da sie ziemlich unterschiedliche Dinge verwirrend bedeuten.

Beginnen Sie mit einem Blick auf die documentation, und beachten Sie, dass Sie beim Laden von normalen Textdateien die "tragbaren" Datentypen verwenden müssen.

Varchar ist einen "nicht-portable" Typ, bei dem:

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

So wie DCookie sagt, CHAR ist die Sache zu gehen, und INTEGER AUSSEN ist ein sehr häufig verwendetes SQL * Loader-Datentyp was Sie wahrscheinlich für DOCUMENTID usw. angeben möchten.

+1

Danke! Ich werde das auch im Hinterkopf behalten. Ich wusste nicht, dass das zwei getrennte Dinge waren - ich nahm an, dass sie Mathe sein sollten. Binary length subfield + specified length erklärt, warum 255 zu 257 wurde. – tjsimmons

+1

+1, stimme David hier zu. Die Unterscheidung zwischen den Spezifikationen des SQL-Loader-Steuerdateityps und der Spezifikation in den Tabellen selbst scheint die Leute immer zu verwirren. Ich glaube nicht, dass ich jemals etwas außer CHAR und DATE in der Kontrolldatei verwendet habe. – DCookie

+0

Übrigens, wissen Sie, warum es diese verschiedenen Typen in Kontrolldateien und Tabellen selbst gibt? – ady