我有一个SQL Loader Control文件,
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 Loader时,它给了我一个错误,
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,但问题相同。
有任何帮助吗?这已经困扰了我两天了。
感谢。
答案 0 :(得分:14)
不要将数据字段定义为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 :(得分:6)
+1 for DCookie,但为了扩展,重要的是区分表中指定的数据类型和SQL *加载器控制文件中的数据类型,因为它们意味着相当不同的东西,令人困惑。
首先查看documentation,并注意在加载常规文本文件时,您需要使用“便携式”数据类型。
Varchar是一种“非便携”类型,其中包括:
...由二进制长度子字段后跟一个指定长度的字符串
组成
正如DCookie所说,CHAR是最重要的,INTEGER EXTERNAL是一种非常常用的SQL * Loader数据类型,你可能想要为DOCUMENTID等指定。