ストアド プロシージャを使用して、Oracle テーブルの 60,000 レコード近くを処理する必要があります。そのような行ごとに、2 番目のテーブルの行を削除して更新し、3 番目のテーブルに行を挿入する必要があります。
カーソル ループを使用すると、手順が完了するまでに約 6 ~ 8 時間かかります。Bulk Collect with Limit に切り替えると、実行時間は短縮されるが処理が正しくない。以下は、手順の一括収集バージョンです。
create or replace procedure myproc()
is
cursor c1 is select col1,col2,col3 from tab1 where col4=3;
type t1 is table of c1%rowtype;
v_t1 t1;
begin
open c1;
loop
fetch c1 bulk collect into v_t1 limit 1000;
exit when v_t1.count=0;
forall i in 1..v_t1.count
delete from tab2 where tab2.col1=v_t1(i).col1;
commit;
forall i in 1..v_t1.count
update tab2 set tab2.col1=v_t1(i).col1 where tab2.col2=v_t1(i).col2;
commit;
forall i in 1..v_t1.count
insert into tab3 values(v_t1(i).col1,v_t1(i).col2,v_t1(i).col3);
commit;
end loop;
close c2;
end;
これらのレコードの約 20k では、最初の削除操作は正しく処理されますが、その後の更新と挿入は処理されません。残りの 40k レコードでは、3 つの操作がすべて正しく処理されます。
何か不足していますか?また、Bulk Collect で使用できる最大 LIMIT 値はいくつですか?