聚合函数报错
最近在工作中遇到一个很奇怪的问题,代码使用了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;
最后运行代码,没有任何问题了。