无法使用SQL Loader将LOB导入Oracle

时间:2009-10-01 21:37:53

标签: oracle import clob sql-loader

我正在尝试从SQL Server导出到Oracle,该表由一个ID和一个存储为nvarchar(max)的非常长的XML字符串组成。

SQL Table -- CREATE TABLE MyStuff (MyID int, MyText nvarchar(max))
Oracle Table -- CREATE TABLE MyStuffImported (MyID int, MyText NCLOB)

我正在使用SQL Server bcp实用程序导出到文本文件(MyStuff.bcp),然后我通过SQL Loader将其导入Oracle。但SQL Loader失败并显示以下消息:“数据文件中的物理记录(MyStuff.bcp)长于最大值(1048576)”并导入0条记录。

我不确定究竟是什么问题。最明显的可能性是MyText比最大值1048576更长,确实有些记录,但不是全部,所以为什么至少有一些记录没有被导入?是否有办法绕过这个限制?

另一种可能性是我在一些讨论板上看到的,即MyText中存在Oracle无法处理的换行符。我希望我已经通过以下方法解决了这个问题:(1)从SQL导出时删除\ r和\ n,以及(2)在SQL Loader控制文件的记录分隔符中使用\ n(参见下面的完整文件) 。我做错了什么,或者没有处理所有案件?

这是我的SQL Loader控制文件的文本。请注意,我使用\作为分隔符,这似乎很奇怪,但它是MyText字段中未使用的唯一字符。因此,你会看到\\我的意思是\因为我正在逃避它。

LOAD DATA  
INFILE "MyStuff.bcp" "str '\\\n'"  
APPEND INTO TABLE MyStuffImported  
(  
 MyID INTEGER EXTERNAL TERMINATED BY "\\",  
 MyText CHAR TERMINATED BY "\\"  
)

有什么建议吗?也许有更好的方法通过SQL Loader导入NCLOB?

2 个答案:

答案 0 :(得分:1)

我能够通过执行以下操作来解决问题:

1)在sqlldr上设置READSIZE和BINDSIZE参数以更改最大限制1048576(绕过“数据文件中的物理记录...超过最大值”错误)
2)在我的控制文件中,在CHAR上设置一个特定的长度(绕过“数据文件中的字段超过最大长度”错误)。见下文:

LOAD DATA  
INFILE "MyStuff.bcp" "str '\\\n'"  
APPEND INTO TABLE MyStuffImported  
(  
    MyID INTEGER EXTERNAL TERMINATED BY "\\",  
    MyText CHAR(10000000) TERMINATED BY "\\"  
)

答案 1 :(得分:0)

我敢打赌你没有在每条记录之后提交,所以一旦你收到错误并且SQL Loader失败,它就会回滚你以前的插入。