2015-06-12 29 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()返回空值,這將返回列表中的第一個非空值。