0

我正在尝试将一个表从 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 加载程序失败并显示以下消息:“数据文件 (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?

4

2 回答 2

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 "\\"  
)
于 2009-10-02T17:39:08.367 回答
0

我敢打赌,你不会在每条记录之后都提交,所以一旦你得到错误并且 SQL 加载器失败,它就会回滚你以前的插入。

于 2009-10-01T22:20:46.770 回答