我在工作中遇到过以下场景。考虑以下块:
Begin
Select Max(Column) from Table where some condition;
Exception
When No_Data_Found then
log into an audit table
End;
当实际上没有找到行时,执行控制不会被转移到异常块中,而是返回 NULL。当尝试在没有该MAX
函数的情况下执行时,执行的控制被捕获在异常块中。
谁能解释一下这种行为?
MAX 是一个聚合函数。聚合函数对一组值执行计算并返回单个值。它们总是为每个组返回一个值(如果您没有 GROUP BY 子句,则只有一个组)。
因此,在您的代码中,您将永远不会有 NO_DATA_FOUND,因为 MAX 将始终返回一个值 - 可能为空。如果取出MAX,就是常规选择,可能会导致没有选择行,从而进入NO_DATA_FOUND块。
纯聚合函数——没有相应的分组列——总是只返回一行。
SQL> desc emp
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> SET NULL [NULL]
SQL> SELECT MAX(sal) FROM emp WHERE 1 = 0;
MAX(SAL)
----------
[NULL]
SQL>