2012-04-30 69 views
8

我有一個SQL Loader控制文件,SQL加載程序錯誤:「可變長度字段超過最大長度。」

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

和它給我一個錯誤,當我在其上運行SQL裝載機,
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

下面是該行..該列的長度方式在255 ..

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

這裏是我的日誌文件中注意到一個奇特

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

我定義的長度爲我的兩個表和控制文件255。然而日誌吐出257?我試着將控制文件中的長度降低到253,所以它在日誌文件中顯示爲255,但是同樣的問題。

任何幫助?這已經困擾我兩天了。

謝謝。

回答

13

不要定義你的數據字段爲VARCHAR2和INTEGER。使用CHAR。大多數情況下,當從文本文件加載數據時,即使是從文本格式轉換而來,也要使用CHAR或DATE。大多數時候你甚至不需要長度說明符。爲CHAR字段的默認長度是255你的控制文件應該是這個樣子:

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

和..就是這樣。用char指定長度也不適合我,但是你發佈的內容完美無缺。謝謝! – tjsimmons

5

+1 DCookie,而是要擴大它的數據類型之間的區別是很重要的,如表和數據類型指定在SQL * loader控制文件中,因爲它們意味着相當不同的事情,令人困惑。

開始看看的documentation,並注意定期加載文本文件,當你需要使用的「便攜式」的數據類型是。

的Varchar是「不可移植」型,其中:

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

那麼作爲DCookie說,CHAR是去的東西,INTEGER外部是一個很常用的SQL * Loader的數據類型你很可能要指定DOCUMENTID等

+1

謝謝!我也會記住這一點。我沒有意識到他們是兩個單獨的東西 - 我認爲他們應該數學。二進制長度子字段+指定的長度解釋了爲什麼255也成爲了257。 – tjsimmons

+1

+1,同意David在這裏。 SQL Loader控制文件類型規範與表格規範之間的區別似乎總是讓人困惑。我不認爲我曾經在控制文件中使用除CHAR和DATE以外的任何東西。 – DCookie

+0

順便問一下,你知道爲什麼控制文件和表格本身有這些不同的類型嗎? – ady