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 列表中的第一个非空值。
我编写了以下查询,希望在找不到行时抛出 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 列表中的第一个非空值。