以优化方式使用 PL/SQL 求和

Getting Sum Using PL/SQL In Optimized Way

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

确实逻辑上没有问题,但是换个样式比如

  • 如果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;
/

您不需要光标:

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;
/