0

我有以下代码,它循环遍历一个 oracle 表单块,然后将其与游标中的数据进行比较(游标从块本身获取数据)。由于三个循环,性能非常糟糕,并且随着大量记录呈指数增长。关于如何改进它的任何建议?

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

您可以将所有块数据发布到临时表中的数据库,然后运行一个过程以使用joins检查数据,这将比您的逻辑效率高几个数量级。

然后根据您的业务需求在最终表中插入/删除/更新,然后从 db 重新查询块。

您将不得不重写几乎所有的逻辑,但您将在 PL/SQL 中创建一个很好的接口,您将能够在您放弃 Forms 的那一天重用它。

于 2013-09-03T07:00:37.047 回答