首页 > Oracle SQL > 聚合函数报错

聚合函数报错

2018年2月10日 发表评论 阅读评论

最近在工作中遇到一个很奇怪的问题,代码使用了Oracle的sum函数,可在程序运行中,抛了一个很奇怪的异常:ORA-01403: no data found,通常来说即使没有任何数据,最多结果应该是null,也是有值的。
- 测试代码:

  declare
    s_sal NUMBER;
  begin
    SELECT sum(t.salary)
     INTO s_sal
     FROM emp t WHERE 1 =2 ;
   EXCEPTION WHEN OTHERS THEN
     dbms_output.put_line(sqlerrm);
  end;

运行完后并没有抛出任何异常。
然后又仔细看了下代码,在where条件下还隐藏着一个group by ,也就是对表进行了分组操作。
- 测试代码2

  declare
    s_sal NUMBER;
  begin
    SELECT sum(t.salary)
     INTO s_sal
     FROM emp t WHERE 1 =2
     GROUP BY t.department_id;
   EXCEPTION WHEN OTHERS THEN
     dbms_output.put_line(sqlerrm);
  end;

再次运行代码:

ORA-01403: no data found

原因终于找到了,SQL脚本中有了Group By,聚合函数是根据分组的结果进行聚合,既有可能返回零条数据也有可能返回多条数据。
- 测试代码3

  declare
    s_sal NUMBER;
  begin
    SELECT sum(t.salary)
     INTO s_sal
     FROM emp t --WHERE 1 =2
     GROUP BY t.department_id;
   EXCEPTION WHEN OTHERS THEN
     dbms_output.put_line(sqlerrm);
  end;

运行代码:

ORA-01422: exact fetch returns more than requested number of rows

当然解决起来也不难,只需要再嵌套一个聚合函数就好了
- 测试代码4

  declare
    s_sal NUMBER;
  begin
    SELECT sum(sum(t.salary))
     INTO s_sal
     FROM emp t --WHERE 1 =2
     GROUP BY t.department_id;
   EXCEPTION WHEN OTHERS THEN
     dbms_output.put_line(sqlerrm);
  end;

最后运行代码,没有任何问题了。

分类: Oracle SQL 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.