在plsql

时间:2017-10-11 11:44:40

标签: oracle plsql

我想(添加p.L_VALUE和p.I_VALUE并使用此结果,减去c.con_value)将一列减去另一列中的另一列,下面的函数成功编译但减法结果不正确:

  • 函数CF_OP_QTYFormula返回Number是V_QTY数(10);从raw_purchase p开始选择sum(nvl(p.L_QTY,0))+ sum(nvl(p.I_QTY,0)) - sum(nvl(c.CON_QTY,0))到V_QTY,raw_consum c WHERE p.ITEMCODE = c.ITEMCODE和p.ITEMCODE =:项目编号和2010年5月31日之间的同一时间' AND ADD_MONTHS(:date1,-1); return v_qty;当no_data_found然后返回null时异常;端;

2 个答案:

答案 0 :(得分:0)

对各个表的值求和,然后将它们交叉连接(而不是交叉连接它们,然后求和,这将创建重复值)。您在查询后也错过了分号。

FUNCTION CF_OP_VALFormula RETURN NUMBER
IS
  V_QTY NUMBER(13);
BEGIN
  SELECT p.total - c.total
  INTO   V_QTY
  FROM   ( SELECT sum(nvl(L_VALUE, 0)) + sum(nvl(I_VALUE, 0)) AS total
           FROM   raw_purchase ) p
         CROSS JOIN
         ( SELECT sum(nvl(c.CON_VALUE, 0)) AS total
           FROM   raw_consum ) c;
  RETURN v_qty; 
END;
/

答案 1 :(得分:0)

一种解决方案是使用子查询分别计算每个表的列总和:

function CF_OP_VALFormula return number is
  v_qty number(13);
begin
  select (select nvl(sum(l_value), 0) + nvl(sum(i_value), 0) from raw_purchase) -
         (select nvl(sum(con_value), 0) from raw_consum)
    into v_qty
    from dual;

  return v_qty; 
end;

注意:您不需要在每一行使用nvl - 您可以在计算总和后使用它。这会加速一些事情。