2009-10-01 55 views
0

我试图从SQL Server导出到Oracle,该表由一个ID和一个存储为nvarchar(max)的非常长的XML字符串组成。无法使用SQL Loader将LOB导入到Oracle

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装载机导入到Oracle。但SQL加载程序失败并显示以下消息:“数据文件中的物理记录(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?

+0

我发现设置sqlldr的READSIZE和BINDSIZE PARAMS我可以改变最大限制1048576,但现在我得到一个不同的问题。这一次日志文件显示“记录1:被拒绝 - 表MYSTUFFIMPORTED,MYTEXT列上的错误,数据文件中的字段超过最大长度”。 MYTEXT是一个nclob,记录1中的文本长度是32kb,远低于我的新限制。我甚至设置ROWS = 1,但没有运气...... – Keith 2009-10-02 01:06:03

回答

1

我可以做来解决这个问题如下:

1)上设置的SQLLDR和READSIZE PARAMS 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 "\\" 
) 
0

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

+0

我很确定没有任何进口。以下是日志所示的内容: 0行成功加载。 0行由于数据错误而未加载。 0行未加载,因为所有WHEN子句均失败。 0行未加载,因为所有字段均为空。 – Keith 2009-10-02 00:49:12