0

ID と nvarchar(max) として格納された非常に長い XML 文字列で構成されるテーブルを SQL Server から 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 Loader 経由で Oracle にインポートしています。しかし、SQL ローダーは次のメッセージで失敗します。「データ ファイル (MyStuff.bcp) の物理レコードが最大値 (1048576) を超えています」と 0 レコードがインポートされます。

正確な問題が何であるかはわかりません。最も明らかな可能性は、MyText が最大長の 1048576 よりも長いことです。実際、一部のレコードは長くなっていますが、すべてではありません。少なくとも一部のレコードがインポートされなかったのはなぜですか? そして、この制限を回避する方法はありますか?

もう 1 つの可能性は、いくつかのディスカッション ボードで読んだことですが、MyText に Oracle が処理できない改行があるというものです。(1) SQL からのエクスポート中に \r と \n を削除し、(2) SQL ローダー制御ファイルのレコード区切り文字で \n を使用することで、この問題を回避していることを願っていました (完全なファイルについては以下を参照)。 . 私は何か間違ったことをしていますか、それともすべてのケースを処理していませんか?

以下は、私の SQL ローダー制御ファイルのテキストです。区切り文字として \ を使用していることに注意してください。これは奇妙に思えますが、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 に答える