2015-06-12 26 views
4

我写了下面的查询,期望NO_DATA_FOUND异常发现没有行时发现。异常没有与SQL 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; 

table_A中没有数据,但没有抛出异常,最终id_variable值变为空。 我google'd和发现MAX函数忽略空值,但我找不到任何补救措施,可以使它抛出异常。

如何让它抛出异常,以便控制进入异常并查看归档表。

没有任何其他选择,以计数(),然后所获得的价值只有当计数()> 0

+0

为什么不选中null? –

+0

你是说添加空检查在哪里条款 – kpvsrkp

+0

添加OTHERS关键字和相同的逻辑到异常处理和我完成 – Thomas

回答

3

没有,也不会进入异常。 MAX不会提高no_data_found因为它会返回NULL值。

看到这个:

SQL> select max(a_id) from table_a; 

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


SQL> select a_id from table_a; 

no rows selected 

SQL> 

没有任何其他选择,以计数(),然后所获得的价值只有数()> 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> 

更新如果你不想抛出异常,只是想从另一个表选择时MAX返回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. 
+0

他不想提出一个例外,他希望从不同的表中获取值时,在table_'中找不到任何东西 –

+0

@a_horse_with_no_name啊!我错过了。编辑并添加了该部分。 –

2

简单多了:

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

你还是从最大查询得到一个行回来,即使没有行,但值是空 - 这就是为什么有没有例外。

通过使用coalesce()返回空值,这将返回列表中的第一个非空值。