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」ステートメントの一部としてレコードを更新した場合、その更新は機能しますか?