2

为了将数据(从 CSV 文件)加载到 Oracle 数据库中,我使用 SQL*Loader。

在接收这些数据的表中,有一varchar2(500)列称为COMMENTS。由于某些原因,我想忽略 CSV 文件中的这些信息。因此,我编写了这个控制文件:

Options (BindSize=10000000,Readsize=10000000,Rows=5000,Errors=100)
  Load Data
  Infile 'XXX.txt'
  Append into table T_XXX
  Fields Terminated By ';'
  TRAILING NULLCOLS
(
    ...
    COMMENTS FILLER,
    ...
)

此代码似乎可以正常工作,因为COMMENTS数据库中的字段始终设置为null.

但是,如果在我的 CSV 文件中有相应COMMENTS字段超过 500 个字符限制的记录,我会从 SQL*Loader 收到错误消息:

Record 2: Rejected - Error on table T_XXX, column COMMENTS.
Field in data file exceeds maximum length

有没有办法真正排除对我的COMMENTS字段的处理?

4

2 回答 2

2

我无法重现您的问题。我正在使用带有 SQL*Loader 10.2.0.1 的 Oracle 10.2.0.3.0。

这是我的测试用例:

SQL> CREATE TABLE test_sqlldr (
  2     ID NUMBER,
  3     comments VARCHAR2(20),
  4     id2 NUMBER
  5  );

Table created

控制文件:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments filler,
  id2
)

数据文件:

1;aaa;2
3;abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;4
5;bbb;6

我正在使用该命令sqlldr userid=xxx/yyy@zzz control=test.ctl,并且我得到了所有没有错误的行:

SQL> select * from test_sqlldr;

        ID COMMENTS                    ID2
---------- -------------------- ----------
         1                               2
         3                               4
         5                               6

您可以尝试另一种方法,我使用以下控制文件得到了相同的预期结果:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments "substr(:comments,1,0)",
  id2
)

根据 Romaintaz 的评论进行更新:当列的大小超过 255 个字符时,我再次查看并设法得到与您相同的错误。这是因为 SQL*Loader 的默认数据类型是 char(255)。如果您有一列包含更多数据,则必须指定长度。以下控制文件解决了包含 300 个字符的列的问题:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments filler char(4000),
  id2
)

希望这可以帮助,

——
文森特

于 2009-06-11T08:00:31.467 回答
1

只是为了提出一个微小的改进,您可以尝试以下操作:

LOAD DATA
IN FILE test.data INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'TRAILING NULLCOLS
(
 id,
 comments char(4000) "substr(:comments, 1, 200)", 
 id2)

现在,您将获取所有评论的前 200 个字符(或您在其位置指定的任何数字) - 除非您的某些输入记录的评论字段的值超过 4000 个字符,在其中它们将被加载器拒绝前面提到的“超过最大长度”错误。但假设这种情况很少见,所有记录都会加载一些截断为 200 个字符的评论。

如果你过去,char(4000)你会得到一个 SQL 加载器错误——你可以把野兽推到多远是有限制的。

于 2009-07-29T23:38:12.510 回答