我有下面的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;
/