优化PL/SQL求和



我有下面的PL/SQL块,它将被转换为一个函数,这将被大量使用,有没有更好、有效的方法以最优化的方式重写?

感谢任何建议或见解。

DECLARE
ln_grand_total   NUMBER;
ln_total         NUMBER;
ln_final_total   NUMBER;
CURSOR E1
IS
SELECT SUM (qty * price * rate)
INTO ln_total
FROM maximo.po_lines pl
JOIN maximo.po_headers ph ON pl.HEADER_ID = ph.HEADER_ID
WHERE ph.HEADER_ID = 0123;
BEGIN
OPEN E1;
FETCH E1 INTO ln_grand_total;
ln_final_total := ROUND (ln_grand_total, 2);
DBMS_OUTPUT.put_line (ROUND (ln_grand_total, 2));
CLOSE E1;
DBMS_OUTPUT.put_line ('ln_final_total --> ' || ln_final_total);
END;
/

您不需要光标:

DECLARE
ln_total NUMBER;
BEGIN
SELECT ROUND( SUM (qty * price * rate), 2 )
INTO   ln_total
FROM   maximo.po_lines pl
JOIN maximo.po_headers ph
ON pl.HEADER_ID = ph.HEADER_ID
WHERE  ph.HEADER_ID = 0123;
DBMS_OUTPUT.put_line ('ln_final_total --> ' || ln_total);
END;
/

逻辑确实没有问题,但可以更改样式,如

  • 如果HEADER_ID是数字类型的列,则删除前面的0123的零,否则引用为'0123'

  • INTO子句不能用于游标定义。摆脱INTO ln_total。所以去掉局部变量

  • 将光标查询中的SUM (qty * price * rate)转换为

    ROUND(SUM (qty * price * rate),2)。所以,去掉ln_final_total局部变量

因此,您可以使用以下代码块

DECLARE
ln_grand_total NUMBER(10,2);
CURSOR E1 IS
SELECT ROUND( SUM(qty * price * rate), 2)
FROM maximo.po_lines pl
JOIN maximo.po_headers ph
ON pl.HEADER_ID = ph.HEADER_ID
WHERE ph.HEADER_ID = '0123';
BEGIN
OPEN E1;
FETCH E1
INTO ln_grand_total;
CLOSE E1;
DBMS_OUTPUT.PUT_LINE('ln_grand_total --> ' || ln_grand_total);
END;
/

最新更新