Oracle sql max函数未出现异常

Oracle sql max函数未出现异常,oracle,plsql,exception-handling,oracle11g,max,Oracle,Plsql,Exception Handling,Oracle11g,Max,我编写了下面的查询,希望在找不到行的情况下引发“找不到数据”异常 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; 表_A中没有数据,但没有引发异常,最终id_变量值变为null。 我在谷歌上搜索并注意到MAX函数忽略了空

我编写了下面的查询,希望在找不到行的情况下引发“找不到数据”异常

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;
表_A中没有数据,但没有引发异常,最终id_变量值变为null。 我在谷歌上搜索并注意到MAX函数忽略了空值,但我找不到任何补救方法,可以使它抛出异常

如何使它抛出一个异常,以便控件处理异常并查看归档表


除了获取count()然后仅在count()大于0时获取值之外,还有其他选择吗。

不,它不会进入异常MAX将不会引发未找到数据,因为它将返回一个NULL

见此:

SQL> select max(a_id) from table_a;

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


SQL> select a_id from table_a;

no rows selected

SQL>
除了获取count()然后仅在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>
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.
Update如果您不想引发异常,只想在MAX返回NULL时从另一个表中选择,则添加一个
If-ELSE

比如说,

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>
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()
返回空值的事实,它返回列表中的第一个非空值。

您是说添加空签入,其中clausead和OTHERS关键字以及与异常处理和u r相同的逻辑done@Thomas当其他人时添加
,这是一个糟糕的建议。阅读:他不想引发异常,他想在
表中找不到任何内容时从另一个表中获取值!我错过了。编辑并添加了该部分。