在更好的方法和缺陷方面改进代码

时间:2012-08-13 05:11:15

标签: database plsql oracle8i

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

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

P.S。不幸的是,我们的客户仍在使用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; 

1 个答案:

答案 0 :(得分:1)

要改变一些事情:

  • 将For循环游标中的SELECT *替换为您实际需要的列。
  • 你的异常块就是我所说的无声杀手。这是一个调试的噩梦,因为除了抑制异常之外它什么也没做,因为你没有记录它,你没有重新提升它 - 而只是通过put_line将所有异常重定向到一个缓冲区,这在除非你从一个总是显示缓冲输出的IDE运行程序,或者通过SQL * Plus运行程序。将其更改为正确的日志记录系统。
  • 我不知道Adjust_accounts做了什么 - 您可以减少这两个select语句并使用您正在调用的存储过程返回金额吗?