1

FORALLで挿入/更新するために使用する2つの配列があります。FORALLで「MERGE」ステートメントを使用できるかどうかわからないため、2つの配列を使用しています。

配列にデータを入力しているときに、既にデータベースにあるかどうかを確認します。そうであれば、入力されたデータを更新することを意図した配列に入れます。それ以外の場合は、配列を挿入します。

TYPE T_TABLE IS TABLE OF TABLE_1%ROWTYPE INDEX BY PLS_INTEGER;
TAB_I T_TABLE;
TAB_U T_TABLE;
--..more code
BEGIN
 SELECT COUNT(*) INTO rec_exist FROM TABLE_1 where COL_1 = ID;
EXCEPTION
 WHEN NO DATA FOUND THEN
   rec_exist := 0;
END;
--.... more code
-- COL1 is PK
IF rec_exist = 0 THEN
 TAB_I(IDX_I).COL1 = col1;
 TAB_I(IDX_I).COL2 = col2;
 IDX_I = IDX_I+ 1;
ELSE
 TAB_U(IDX_U).COL1 = col1;
 TAB_U(IDX_U).COL2 = col2;
 IDX_U = IDX_U+ 1;
END IF:

これらのテーブルを送信して、1000 レコードごとに挿入/更新します。

ここで問題は、table_1 にまだ存在しないレコードを受け取ったと想像してください。それを tab_i 配列に入れることにしました。このレコードの別のレコード更新を受け取ります。テーブルにないので、tab_i に入れることにします。これを forall ループに挿入すると問題が発生します。

私のforallループが次のようになっている場合

FORALL .. INSERT

FORALL ..更新

専念;

まだテーブルにはないが、その上の forall の一部としてテーブルに挿入された「update」ステートメントの一部としてレコードを更新した場合、その更新は機能しますか?

4

1 に答える 1

2

FORALL を使用した MERGE - 最近何かが変更されていない限り (おそらく 12c?)、サポートされていません。これは、USING 句が PL/SQL コレクションを含むさまざまなソースから複数の値を選択できるため、MERGE ステートメントは FORALL と同じアクションを暗黙的に実行するという理由によるものです。私はこれを試したことはありませんが、この AskTom の投稿を含む例を見てきました。

UPDATE の前に INSERT を実行すると、UPDATE の実行時に INSERT された値が表示されます。

共有してお楽しみください。

于 2013-07-24T22:24:00.413 に答える