如何真正跳过列的处理?

时间:2009-06-11 07:27:33

标签: oracle sql-loader

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

在接收这些数据的表格中,有一个名为varchar2(500)的{​​{1}}列。 出于某些原因,我想忽略CSV文件中的这些信息。 因此,我写了这个控制文件:

COMMENTS

此代码似乎工作正常,因为数据库中的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

但是,如果在我的CSV文件中我有一条记录,其中相应的null字段超出了500个字符的限制,我从SQL * Loader收到错误:

COMMENTS

有没有办法真的排除Record 2: Rejected - Error on table T_XXX, column COMMENTS. Field in data file exceeds maximum length 字段的处理?

2 个答案:

答案 0 :(得分: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
)

希望这有助于,

-
文森特

答案 1 :(得分: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 Loader错误 - 你可以在多大程度上推动野兽。