9

我有一个 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 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,但同样的问题。

有什么帮助吗?这已经困扰了我两天了。

谢谢。

4

2 回答 2

16

不要将数据字段定义为 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
)
于 2012-04-30T15:25:45.517 回答
6

+1 用于 DCookie,但要扩展它,区分表中指定的数据类型和 SQL*loader 控制文件中的数据类型很重要,因为它们的含义完全不同,令人困惑。

从查看文档开始,并注意在加载常规文本文件时,您需要使用“可移植”数据类型。

Varchar 是一种“不可移植”的类型,其中:

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

因此,正如 DCookie 所说,CHAR 是要使用的东西,而 INTEGER EXTERNAL 是一种非常常用的 SQL*Loader 数据类型,您可能希望为 DOCUMENTID 等指定它。

于 2012-04-30T15:59:01.957 回答