0

私は次のコードを持っています.Oracleフォームブロックをループし、カーソルからのデータと比較します(カーソルはブロック自体からデータを取得します)。3 つのループがあるため、パフォーマンスはかなり悪く、多くのレコードで指数関数的に増加します。それを改善する方法について何かアドバイスはありますか?

loop
    if :PAYMENTS_COLLECTIONS.CHECK_BOX='Y' then
        temp_rec := :system.cursor_record;
        acc_payment_no1 := :payments_collections.acc_payment_numb;

        for pay_same_trans in payments_in_same_trans(:payments_collections.acc_payment_numb) 
        loop
            first_record;
            acc_payment_no2 := pay_same_trans.acc_payment_no;

            REMOVE_PAID_TRANSACTION(pay_same_trans.payment_trans_seq_no);
            loop
                if pay_same_trans.acc_payment_no = :PAYMENTS_COLLECTIONS.acc_payment_numb and :PAYMENTS_COLLECTIONS.CHECK_BOX='Y' then
                    receipt_selected := true;
                    exit;
                end if;
                if :system.last_record = 'TRUE' then
                  exit;
                end if; 
                next_record;
            end loop;
            if receipt_selected = false then
                raise not_reverting_whole_trans;
            end if;
            receipt_selected := false;
        end loop;
        go_record(temp_rec);
    end if;
    if :system.last_record = 'TRUE' then
      exit;
    end if; 
    next_record;
end loop;
4

1 に答える 1

2

すべてのブロック データを一時テーブルの db に投稿してから、プロシージャを実行してデータをjoinsでチェックできます。これは、ロジックよりも桁違いに効率的です。

次に、ビジネス要件に従って最終テーブルを挿入/削除/更新し、db からブロックを再クエリします。

ほとんどすべてのロジックを書き直す必要がありますが、PL/SQL で優れたインターフェイスが作成され、Forms を削除したその日に別の目的で再利用できるようになります。

于 2013-09-03T07:00:37.047 に答える