2012-04-30 56 views
8

Ho un file SQL Loader di controllo,Errore caricatore SQL: "Il campo lunghezza variabile supera la lunghezza massima."

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

e mi sta dando un errore quando ho eseguito SQL Loader su di esso,
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

Ecco quella fila .. la lunghezza della colonna è così sotto 255 ..

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

Ed ecco una stranezza che ho notato all'interno del file di log

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

ho definire la lunghezza di 255 sia in mio tavolo e file di controllo. Eppure il log lo sputa come 257? Ho provato a ridimensionare la lunghezza nel file di controllo a 253, quindi appare come 255 nel file di registro, ma lo stesso problema.

Qualsiasi aiuto? Questo mi ha infastidito per due giorni.

Grazie.

risposta

13

Non definire i campi dati come VARCHAR2 e INTEGER. Usa CHAR. La maggior parte delle volte, quando si caricano dati da un file di testo, si desidera utilizzare CHAR, o forse DATE, anche se viene convertito da un modulo di testo. La maggior parte delle volte non hai nemmeno bisogno di un identificatore di lunghezza. La lunghezza di default per un campo CHAR è 255. Il file di controllo dovrebbe essere simile:

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

E .. era così. Anche specificare lunghezze con char non lo faceva per me, ma quello che hai pubblicato funzionava perfettamente. Grazie! – tjsimmons

5

+1 per DCookie, ma per espandere il che è importante distinguere tra i tipi di dati, come specificato in una tabella e tipi di dati in un file di controllo del caricatore SQL * poiché significano cose piuttosto diverse, in modo confuso.

Inizia con uno sguardo allo documentation e nota che quando si caricano file di testo normali è necessario utilizzare i tipi di dati "portatili".

Varchar è di tipo "non-portatile", in cui:

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

Così come dice DCookie, char è la cosa di andare per, e INTEGER esterno è uno SQL * tipo di dati Loader molto comunemente usato che probabilmente vorresti specificare per DOCUMENTID, ecc.

+1

Grazie! Lo terrò anche a mente. Non mi rendevo conto che erano due cose separate - presumo che dovessero essere matematici. Il sottocampo di lunghezza binaria + lunghezza specificata spiega perché 255 è diventato 257, pure. – tjsimmons

+1

+1, d'accordo con David qui. La distinzione tra le specifiche del tipo di file di controllo di SQL Loader e le specifiche nelle tabelle stesse sembra sempre confondere la gente. Non penso di aver mai usato nulla oltre a CHAR e DATE nel file di controllo. – DCookie

+0

A proposito, sai perché ci sono questi diversi tipi nei file di controllo e nelle tabelle stesse? – ady