SQL Loader错误:"可变长度字段超出最大长度."

tjs*_*ons 9 oracle sql-loader

我有一个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)
)
Run Code Online (Sandbox Code Playgroud)

当我在其上运行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,但是同样的问题.

有帮助吗?这已经让我错过了两天了.

谢谢.

DCo*_*kie 15

不要将数据字段定义为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=BLANKS,
  USERFILENAME,
  STORAGEPATH
)
Run Code Online (Sandbox Code Playgroud)


Dav*_*dge 6

为DCookie +1,但为了扩展,重要的是区分表中指定的数据类型和SQL*加载器控制文件中的数据类型,因为它们意味着相当不同的东西,令人困惑.

首先看一下文档,并注意在加载常规文本文件时,您需要使用"可移植"数据类型.

Varchar是一种"非便携"类型,其中:

...由二进制长度子字段后跟一个指定长度的字符串组成

因此,正如DCookie所说,CHAR是要做的事情,INTEGER EXTERNAL是一种非常常用的SQL*Loader数据类型,您可能需要为DOCUMENTID等指定它.