Substring 如何使用SQL*Loader截断数据以适应字段?(ORA-12899)

Substring 如何使用SQL*Loader截断数据以适应字段?(ORA-12899),substring,truncate,sql-loader,ora-12899,Substring,Truncate,Sql Loader,Ora 12899,使用Oracle SQL*Loader,我试图将另一个数据库中的变长字符串(lob)列加载到Oracle中的varchar2(4000)列中。我们有超过4000个字符的字符串,但每个人都同意这些字符串可以而且应该在迁移中被截断(我们已经查看了超过4000个字符的数据,这没有意义)。为此,我在控制文件中以这种方式指定了列: COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)", 但是,SQL*Loader仍然拒绝数据文件中此记录长度超过4000个字符

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

COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)",
但是,SQL*Loader仍然拒绝数据文件中此记录长度超过4000个字符的任何行:

记录6484:已拒绝-表日志注释、列注释出错。 ORA-12899:列注释的值太大(实际值:11477,最大值:4000)

记录31994:已拒绝-表日志注释、列注释出错。 ORA-12899:列注释的值太大(实际值:16212,最大值:4000)

记录44063:已拒绝-表日志注释、列注释出错。 ORA-12899:列注释的值太大(实际值:62433,最大值:4000)


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

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

由所有帐户加载

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
如果我切换到directpath加载,那么我会在您看到时得到smae错误

ORA-12899: value too large for column COMMENTS (actual: 4005, maximum: 4000)
最后,我将其分为两个阶段。。现在我有了一个staging表,其中有一个CLOB类型的列,我用它加载

COMMENTS CHAR(2000000000) 
然后使用

insert into propertable
select dbms_lob.substr(comments,1,4000)
from staging_table;
希望这有帮助