SQL Loader错误:"可变长度字段超过最大长度。"

9

我有一个SQL Loader控制文件,

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,但结果相同。

需要帮助吗?这让我苦恼了两天。

谢谢。

2个回答

16

不要将数据字段定义为VARCHAR2和INTEGER,使用CHAR。大多数情况下,当从文本文件加载数据时,您应该使用CHAR,或者也许是DATE,尽管即使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
)

1
就是这样了。使用char指定长度对我也没用,但你发布的内容完美地解决了我的问题。谢谢! - tjsimmons

7
+1支持DCookie的观点,但需要明确的是,在表格中指定的数据类型和在SQL*Loader控制文件中指定的数据类型指的是不同的事情,这很容易令人感到困惑。
首先,查看文档,并注意在加载常规文本文件时,您需要使用“可移植”的数据类型。
VARCHAR是一种“非便携式”类型,其中:

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

因此,正如DCookie所说,CHAR是最好的选择,INTEGER EXTERNAL是一个非常常用的SQL*Loader数据类型,您可能需要对DOCUMENTID等进行指定。

1
谢谢!我也会记住的。我没有意识到它们是两个不同的东西 - 我以为它们应该匹配。二进制长度子字段+指定长度解释了为什么255变成了257。 - tjsimmons
1
+1,我同意David的观点。SQL Loader控制文件类型规范和表中规范之间的区别似乎总是让人感到困惑。我认为除了CHAR和DATE之外,我从未在控制文件中使用过其他任何内容。 - DCookie
顺便问一下,你知道为什么控制文件和表本身会有这些不同的类型吗? - ady
1
控制文件格式的多样性代表了诸如数值之类的值在外部文件中排序的各种方式。当它们被加载时,在 Oracle 中只有浮点数和数字,但是它们在数据文件或流中的表示可能会有很大的差异。 - David Aldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接