4

Oracle SQL*Loader を使用して、別のデータベースの可変長文字列 (lob) であった列を Oracle の varchar2(4000) 列にロードしようとしています。4000 文字をはるかに超える文字列がありますが、移行時にこれらの文字列を切り詰めることができ、切り捨てられるべきであることに全員が同意しました (4000 文字を超えるデータを調べましたが、意味がありません)。そのために、制御ファイルで次のように列を指定しました。

COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)",

ただし、SQL*Loader は、データ ファイル内でこのレコードが 4000 文字を超える行を引き続き拒否します。

レコード 6484: 拒否 - 表 LOG_COMMENT、列 COMMENTS のエラー。ORA-12899: 列COMMENTSの値が大きすぎます(実際: 11477、最大: 4000)

レコード 31994: 拒否 - 表 LOG_COMMENT、列 COMMENTS のエラー。ORA-12899: 列COMMENTSの値が大きすぎます(実際: 16212、最大: 4000)

レコード 44063: 拒否 - 表 LOG_COMMENT、列 COMMENTS でエラー。ORA-12899: 列COMMENTSの値が大きすぎます(実際: 62433、最大: 4000)

はるかに小さい部分文字列を取得しようとしましたが、それでも同じエラーが発生しました。制御ファイルを変更して、4000 文字を超える文字列データを切り捨てて varchar2(4000) 列にする方法を教えてください。

4

2 に答える 2

1

データの ENCODING と Oracle ENCODING が競合していないことを確認してください。この場合、ロード時に CHARACTERSET オプションを使用します。

于 2010-10-07T10:18:11.867 に答える
0

すべてのアカウントで

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)

最後に、それを2段階のロードに分割しました..ロードするCLOBタイプの列を持つステージングテーブルがあります

COMMENTS CHAR(2000000000) 

次に、eth メインテーブルに挿入されます。

insert into propertable
select dbms_lob.substr(comments,1,4000)
from staging_table;

お役に立てば幸いです

于 2016-02-19T10:58:32.227 に答える