0

我有以下 PL/SQL 代码,用于调用 API(由客户端提供)以调整帐户。

如果在编写此块时有任何缺点或更好的方法或方法,我想改进我的代码。

PS 不幸的是,我们的客户仍在为他们的产品使用 Oracle 8i。

PLSQL 代码

DECLARE
    v_account_id account_adjustments.account_id%TYPE;
    v_adj_no     account_adjustments.adj_no%TYPE;
    v_old_qty    product_warehouse.new_qty%TYPE;
    v_new_qty    product_warehouse.new_qty%TYPE;
BEGIN
    v_old_qty := NULL;
    v_new_qty := NULL;

    FOR acnt IN (SELECT *
                 FROM   temp_table a) LOOP
        SELECT a.new_qty
        INTO   v_old_qty
        FROM   product_warehouse a
        WHERE  ( a.product_no = acnt.product_no );

        Adjust_accounts (in_service_product_no => acnt.product_no,
                         in_service_qty => acnt.qty,
                         out_account_id => v_account_id,
                         out_adj_no => v_adj_no);

        SELECT b.new_qty
        INTO   v_new_qty
        FROM   product_warehouse b
        WHERE  ( b.product_no = acnt.product_no );

        INSERT INTO account_year_todate
                    (product_no,
                     account_id,
                     adj_no,
                     qty_bad,
                     qty_warehouse,
                     qty_factory)
        VALUES      ( acnt.product_no,
                     v_account_id,
                     v_adj_no,
                     acnt.qty,
                     v_old_qty,
                     v_new_qty );
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
      dbms_output.Put_line ('exceptions '
                            || SQLERRM);

      ROLLBACK;
END; 
4

1 回答 1

1

一些要改变的事情:

  • SELECT *用您实际需要的列替换For 循环光标。
  • 你的异常块就是我所说的无声杀手。这是一个调试噩梦,因为它除了抑制异常之外什么都不做,因为你没有记录它,你没有重新引发它 - 而是只是将所有异常重定向put_line到一个缓冲区,它根本不可见,除非你'从始终显示缓冲区输出的 IDE 或通过 SQL*Plus 重新运行程序。将其更改为适当的日志记录系统。
  • 我不知道是什么Adjust_accounts- 你可能会减少这两个选择语句并使用你调用的存储过程返回金额?
于 2012-08-13T07:12:39.020 回答