Database 从更好的方法和缺陷方面改进代码
我使用以下PL/SQL代码调用API(由客户机提供) 为了调整账目 如果在编写这个代码块时有任何缺点或更好的方法,我想改进我的代码 另外,不幸的是,我们的客户仍在使用Oracle 8i作为他们的产品 PLSQL代码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
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*
- 你的例外块就是我所说的沉默杀手。这是一个调试噩梦,因为它除了抑制异常之外什么都不做,因为你没有记录它,你没有引发它——而是通过
将所有异常重定向到一个根本不可见的缓冲区,除非你从一个始终显示缓冲区输出的IDE运行程序,或者通过SQL*Plus。将其更改为正确的日志记录系统put\u line
- 我不知道
做了什么-您可能可以减少这两条select语句,并使用调用的存储过程返回金额Adjust\u accounts
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不客气