0

ストアド プロシージャを使用して、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 値はいくつですか?

4

1 に答える 1