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

Database 从更好的方法和缺陷方面改进代码,database,plsql,oracle8i,Database,Plsql,Oracle8i,我使用以下PL/SQL代码调用API(由客户机提供) 为了调整账目 如果在编写这个代码块时有任何缺点或更好的方法,我想改进我的代码 另外,不幸的是,我们的客户仍在使用Oracle 8i作为他们的产品 PLSQL代码 DECLARE v_account_id account_adjustments.account_id%TYPE; v_adj_no account_adjustments.adj_no%TYPE; v_old_qty product_wareh

我使用以下PL/SQL代码调用API(由客户机提供) 为了调整账目

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

另外,不幸的是,我们的客户仍在使用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; 
有些事情需要改变:

  • 用实际需要的列替换For循环光标中的
    SELECT*
  • 你的例外块就是我所说的沉默杀手。这是一个调试噩梦,因为它除了抑制异常之外什么都不做,因为你没有记录它,你没有引发它——而是通过
    put\u line
    将所有异常重定向到一个根本不可见的缓冲区,除非你从一个始终显示缓冲区输出的IDE运行程序,或者通过SQL*Plus。将其更改为正确的日志记录系统
  • 我不知道
    Adjust\u accounts
    做了什么-您可能可以减少这两条select语句,并使用调用的存储过程返回金额

如果有人投票关闭此帖子,请说明关闭原因。Regardsit可能更适合感谢您的宝贵建议。我正在IDE中运行这个匿名块,以便查看
put\u行
输出。如果我想记录异常,我想在异常部分捕获
acnt.product\u no
,作为我的循环在异常之前结束。在这种情况下,最好的方法是什么?我之所以有两条select语句,是因为在
Adjust\u accounts
API中,它调整了账户和数量。所以第一个sql是获取旧数量,第二个sql是获取新数量。Regards@Polappan现在还可以,但当您将其移动到QA/staging/production server时,您可能再也不能自由地从IDE以anon块的形式运行该过程。最好的方法是使用一个运行自治事务的存储过程,并将异常记录到任何表中;带有日期、时间、用户ID、结果和任何您想要存储的数据。@Polappan至于我的循环在异常之前结束-当出现异常时,程序立即从循环中断并跳入异常部分。如果要存储
acnt.product\u no
值,请将其分配给一个局部变量,就像对
v\u new\u quantity
v\u old\u quantity
和其他输入所做的那样。Regards@Polappan不客气