1

仕事で次のシナリオに出くわしました。次のブロックを検討してください。

Begin
Select Max(Column) from Table where some condition;
Exception
When No_Data_Found then
log into an audit table
End;

実際に行が見つからない場合、実行の制御は例外ブロックに迂回されず、NULL が返されます。関数なしで実行しようとするとMAX、実行の制御が例外ブロックに引っかかります。

誰でもこの動作を説明できますか?

4

2 に答える 2

2

MAX は集計関数です。集計関数は、一連の値に対して計算を実行し、単一の値を返します。グループごとに常に 1 つの値を返します (GROUP BY 句がない場合は、1 つのグループになります)。

したがって、コードでは、MAX は常に 1 つの値 (null の可能性がある) を返すため、NO_DATA_FOUND はありません。MAX を取り出すと、それは通常の選択であり、結果として行が選択されず、NO_DATA_FOUND ブロックに入る可能性があります。

于 2012-11-20T01:24:57.593 に答える
0

対応する grouped-by 列を持たない純粋な集計関数は、常に正確に 1 つの行を返します。

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>
于 2012-11-20T01:29:23.593 に答える