2012-04-30 11 views
8

Mam plik SQL Loader sterowania,Błąd modułu ładującego SQL: "Pole długości zmiennej przekracza maksymalną długość."

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

i to daje mi błąd podczas uruchamiania SQL Loader na niej
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

Oto ten wiersz .. długość tej kolumnie jest droga poniżej 255 ..

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

I oto kuriozum zauważyłem w pliku dziennika

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

zdefiniować długość jako 255 w obu moim stole i kontroli. Jednak dziennik wypluwa go jako 257? Próbowałem powalić długość w pliku kontrolnym do 253, więc pojawia się jako 255 w pliku dziennika, ale ten sam problem.

Każda pomoc? To mnie podsyciło od dwóch dni.

Dzięki.

Odpowiedz

13

Nie definiuj pól danych jako VARCHAR2 i INTEGER. Użyj CHAR. W większości przypadków, podczas ładowania danych z pliku tekstowego, chcesz użyć CHAR lub być może DATE, chociaż nawet to jest konwertowane z formularza tekstowego. W większości przypadków nie potrzebujesz nawet specyfikatora długości. Domyślna długość pola CHAR jest 255. Plik kontrola powinna wyglądać mniej więcej tak:

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

I ... to było to. Określenie długości za pomocą char też tego nie robi, ale to, co wysłałeś, działało idealnie. Dziękuję Ci! – tjsimmons

5

+1 dla DCookie, ale rozszerzyć na to, że ważne jest, aby rozróżnić typy danych, jak określono w tabeli i danych typów w pliku kontrolnym programu ładującego SQL *, ponieważ mają one dość różne znaczenie, myląco.

Zacznij od spojrzenia na documentation i pamiętaj, że podczas ładowania zwykłych plików tekstowych musisz używać "przenośnych" typów danych.

Varchar to „nieistniejące Portable” typ, w którym:

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

Tak jak mówi DCookie, CHAR jest rzeczą, aby przejść do i INTEGER zewnętrzny jest bardzo powszechnie stosowane SQL * typ danych Loader które prawdopodobnie chcesz określić dla DOCUMENTID itp.

+1

Dzięki! Będę o tym pamiętać. Nie zdawałem sobie sprawy, że są to dwie osobne rzeczy - przypuszczałem, że powinny być matematyczne. Podpole długości binarnej + określona długość wyjaśnia, dlaczego 255 również stało się 257. – tjsimmons

+1

+1, Zgadzam się z Davidem tutaj. Rozróżnienie między typami plików sterujących programu ładującego SQL a specyfikacją w samych tabelach zawsze wydaje się mylące. Nie sądzę, abym kiedykolwiek użył czegoś oprócz CHAR i DATE w pliku kontrolnym. – DCookie

+0

Swoją drogą, czy wiesz, dlaczego te same typy plików są zawarte w plikach kontrolnych i tabelach? – ady

Powiązane problemy