4

使用 Oracle SQL*Loader,我试图将另一个数据库中的可变长度字符串 (lob) 列加载到 Oracle 中的 varchar2(4000) 列中。我们有超过 4000 个字符的字符串,但每个人都同意这些字符串可以而且应该在迁移中被截断(我们已经查看了超过 4000 个字符的数据,它没有意义)。为此,我在控制文件中以这种方式指定了该列:

COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)",

但是,SQL*Loader 仍然拒绝数据文件中这条记录超过 4000 个字符的任何行:

记录 6484:拒绝 - 表 LOG_COMMENT 列 COMMENTS 上的错误。ORA-12899: COMMENTS 列的值太大(实际值:11477,最大值:4000)

记录 31994:拒绝 - 表 LOG_COMMENT 列 COMMENTS 上的错误。ORA-12899: COMMENTS 列的值太大(实际值:16212,最大值:4000)

记录 44063:拒绝 - 表 LOG_COMMENT 列 COMMENTS 上的错误。ORA-12899: COMMENTS 列的值太大(实际值:62433,最大值:4000)

我尝试采用更小的子字符串,但仍然出现相同的错误。如何更改我的控制文件以将超过 4000 个字符的字符串数据截断为 varchar2(4000) 列?

4

2 回答 2

1

检查以确保您的数据 ENCODING 和 Oracle ENCODING 不冲突。在这种情况下,加载时使用 CHARACTERSET 选项。

于 2010-10-07T10:18:11.867 回答
0

所有人都认为

COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)",

是正确的语法。使用 sqlldr 11.2.0.1 它成功地为我工作,直到输入记录列> 4000,我得到一个

ORA-01461: can bind a LONG value only for insert into a LONG column

如果我切换到直接路径负载,那么我会像你一样得到 smae 错误。

ORA-12899: value too large for column COMMENTS (actual: 4005, maximum: 4000)

最后,我将其拆分为 2 阶段负载。我现在有一个暂存表,其中包含一个 CLOB 类型的列,我用它加载

COMMENTS CHAR(2000000000) 

然后将其插入到 eth 主表中

insert into propertable
select dbms_lob.substr(comments,1,4000)
from staging_table;

希望这有帮助

于 2016-02-19T10:58:32.227 回答