NO_DATA_FOUND和%NOTFOUND的區別

風靈使發表於2018-04-18

SELECT … INTO 語句觸發 NO_DATA_FOUND
當一個顯式遊標的WHERE子句未找到時觸發%NOTFOUND

UPDATEDELETE 語句的WHERE 子句未找到時,觸發 SQL%NOTFOUND

在提取迴圈中要用 %NOTFOUND%FOUND 來確定迴圈的退出條件,不要用 NO_DATA_FOUND.


oracle資料庫儲存過程中NO_DATA_FOUND不起作用解決

1.首先建立一個表lengzijiantest,表中只有一個欄位f_id

CREATE TABLE LENGZIJIANTEST  
(  
  F_ID  NUMBER                                  NOT NULL 
)

2.插入一條資料

insert into lengzijiantest values (1)

3.現在表裡面只有一條資料,值為1;

4.寫入如下命令

DECLARE 
   v_tmp   NUMBER := 0;  
BEGIN 
   SELECT f_id  
     INTO v_tmp  
     FROM lengzijiantest  
    WHERE f_id = 2;  
EXCEPTION  
   WHEN NO_DATA_FOUND  
   THEN 
      DBMS_OUTPUT.put_line ('找不到資料');  
END;

5.因為資料庫中只有1的資料,該條語句會列印出“找不到資料”;如果把sql寫成如下方式,則不會列印“找不到資料”

DECLARE 
   v_tmp   NUMBER := 0;  
BEGIN 
   SELECT min(f_id)  
     INTO v_tmp  
     FROM lengzijiantest  
    WHERE f_id = 2;  
EXCEPTION  
   WHEN NO_DATA_FOUND  
   THEN 
      DBMS_OUTPUT.put_line ('找不到資料');  
END;

6.具體原因是由於在sql中使用了聚合函式,當使用聚合函式時,NO_DATA_FOUND是不起作用的,在這一點上也吃了小虧,不過問題不大,在此記錄下問題。