0

ファイルに 100k の ID のリストがあります。これらの ID を反復処理したい:

ごとに、が表にあるidかどうかを確認します。id

  • updated_dateそうであれば、そのフラグを更新します
  • そうでない場合は、新しいレコードを追加します(id, updated_date)

MERGE節を調べて見つけました。欠点は、MERGEID がテーブルにある必要があることです。一時テーブルの作成は、必要な場合にのみ許可されています。

誰でも私を正しい方向に向けることができますか? コードではなく、データベースで実行できるスクリプトでなければなりません。

merge into MyTable x
using ('111', '222', all my ids) b
  on (x.id = b.id)
when not matched then 
  insert (id, updated_date) values (b.id, sysdate)
when matched then
  update set x.updated_date = sysdate;

編集:一時テーブルが唯一のオプションである場合は、一時テーブルを使用できるようになりました。

4

2 に答える 2

1

Oracle サーバーからファイルにアクセスできる場合は、SQL を使用してファイルから読み取ることができる外部テーブルを定義できます。

構文は SQL*Loader に基づいています。これは、日常的な仕事ではなく、繰り返し行う作業に適しているかもしれません。

または、SQL*Loader 自体を使用してテーブルにロードしたり、Microsoft Access または同様のデータベースから ODBC をロードしたりすることもできます。

もう 1 つのオプションは、100,000 回の挿入を実行することです。100 程度の挿入ごとに取得し、それらを匿名ブロックでラップすることで、これのパフォーマンスを大幅に向上させることができます。これにより、データベースへのラウンドトリップが節約されます。

insert into tmp values(1);
insert into tmp values(12);
insert into tmp values(145);
insert into tmp values(234);
insert into tmp values(245);
insert into tmp values(345);
....
insert into tmp values(112425);

使用する ...

begin
  insert into tmp values(1);
  insert into tmp values(12);
  insert into tmp values(145);
  insert into tmp values(234);
  ...
  insert into tmp values(245);
end;
/
begin
  insert into tmp values(345);
  ...
  insert into tmp values(112425);
end;
/

それが通常のタスクであれば、私は間違いなく外部テーブルに行きます。

于 2015-08-21T09:38:16.690 に答える