エラーSQL*Loader -606 が表示されます。これは、次のことを意味します。
SQL*Loader制御ファイルのINTO TABLE句で指定されたシノニムは、データベース・リンクを介してリモート・オブジェクトを指定しています。INTO TABLE句に指定できるのは、既存のローカル表のシノニムだけです。
SQL*Loader を使用してリモート テーブルに挿入する方法はありますか?
エラーSQL*Loader -606 が表示されます。これは、次のことを意味します。
SQL*Loader制御ファイルのINTO TABLE句で指定されたシノニムは、データベース・リンクを介してリモート・オブジェクトを指定しています。INTO TABLE句に指定できるのは、既存のローカル表のシノニムだけです。
SQL*Loader を使用してリモート テーブルに挿入する方法はありますか?
10g を使用しているため、SQL ローダーの代わりに外部テーブルを使用できます。
外部テーブルのセットアップは簡単です。 詳細をご覧ください。
外部テーブルに新しいファイルを取得させるには (繰り返しプロセスがあるため、これを行う必要がある場合があります)、次のようにします。
alter table your_ext_table_name location ('<newfile.name>')
/
次に、これを行うことができます:
insert into whatever_table@remote_db
select * from your_ext_table_name
/
これにより、2 ロットの DML が回避されます。外部テーブルは、適切に調整された SQL*Loader プロセスほど高速ではありませんが、ネットワーク トラフィックの負担 (シナリオでは避けられない) に比べれば些細なことです。
create table temp_table as select * from remote_table@remote_db where 1 = 2;
load using sql*loader into temp_table;
insert into remote_table@remote_db select * from temp_table;
テーブルがあるサーバーでSQLローダーを実行しますか?
そうでない理由かもしれませんが、これは私には最も簡単なようです。
外部テーブルを使用できなかった場合 (たとえば、データ ファイルがデータベース サーバーではなくクライアント マシン上にあるため)、リモート オブジェクトのビューに挿入できます。
例えば
create database link schema1 connect to schema1 identified by schema1 using 'XE';
create view schema1_test_vw as select * from test@schema1;
load data
infile *
append
into table schema1_test_vw
( id POSITION(1:4) INTEGER)
begindata
1001
1002
1003
私のXEテストで成功しました。ビューの場合、すべての列サイズ、データ型などはローカル スキーマで固定されるため、sqlldr には問題がありません。