sql max 函数没有异常

exception is not coming with sql max function

我编写了以下查询,希望在找不到行时抛出 NO_DATA_FOUND 异常。

BEGIN
  SELECT MAX(A_id) + 1 INTO id_variable from table_A;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
  SELECT MAX(A_id) + 1 INTO id_variable from table_A_archive;
END;

table_A 中没有数据,但没有抛出异常,最终 id_variable 值变为空。 我 google 注意到 MAX 函数忽略空值,但我找不到任何可以使其抛出异常的补救措施。

如何让它抛出异常,以便控制异常并查看存档 table。

除了计算 count() 然后仅当 count() > 0.

时才获取值之外,还有其他选择吗

不,不会出现异常。 MAX 不会提高 no_data_found 因为它会 return 一个 NULL 值.

看到这个:

SQL> select max(a_id) from table_a;

 MAX(A_ID)
----------


SQL> select a_id from table_a;

no rows selected

SQL>

is there any other alternative than taking the count() and then getting the value only if count() > 0.

您可以使用 自定义异常,然后在值为 NULL 引发 它.

例如,

SQL> CREATE TABLE table_A(a_id NUMBER);

Table created.

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    id_variable NUMBER;
  3    is_null     EXCEPTION;
  4  BEGIN
  5    SELECT MAX(A_id) + 1 INTO id_variable FROM table_A;
  6    IF id_variable IS NULL THEN
  7      raise is_null;
  8    END IF;
  9  EXCEPTION
 10  WHEN is_null THEN
 11    DBMS_OUTPUT.PUT_LINE('Came into Exception');
 12  END;
 13  /
Came into Exception

PL/SQL procedure successfully completed.

SQL>

Update 如果你不想抛出异常而只是想 select from another table 当 MAX returns 为 NULL 时,则添加一个 IF-ELSE 块。

例如,

SQL> CREATE TABLE table_A(a_id NUMBER);

Table created.

SQL> CREATE TABLE table_b(a_id NUMBER);

Table created.

SQL> INSERT INTO table_b VALUES(1);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    id_variable NUMBER;
  3  BEGIN
  4    SELECT max(A_id) + 1 INTO id_variable from table_A;
  5    IF id_variable IS NULL
  6    THEN
  7    SELECT A_id + 1 INTO id_variable FROM table_b;
  8    END IF;
  9    DBMS_OUTPUT.PUT_LINE('ID value is '||id_variable);
 10  END;
 11  /
ID value is 2

PL/SQL procedure successfully completed.

更简单:

SELECT COALESCE((SELECT MAX(A_id) from table_A), 
  (SELECT MAX(A_id) from table_A_archive)) + 1
FROM DUAL
INTO id_variable;

即使没有行,您仍会从 max 查询中返回一行,但值为 null - 这就是没有例外的原因。

利用 coalesce() 返回 null 的优势,returns 列表中的第一个非空值。