为了将数据(从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
字段的处理?
答案 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错误 - 你可以在多大程度上推动野兽。