2012-10-25 6 views
8

このコードがなぜ機能しないのか不思議です。私はサプライヤID = 1を私のテーブルに持っていません。 exceptionセクション追加することによって、次のようにコードを書き換えるNO_DATA_FOUND例外をキャッチするpl sql%NOTFOUND

DECLARE 
    VAR SUPP_NM VARCHAR(100); 
    VAR_SUPP_ID NUMBER := 1; 
    WHILE_VAR CHAR := 'Y'; 
BEGIN 
    SELECT SUPP_NM 
    INTO VAR_SUPP_NM 
    FROM TEST.SUPPLIER 
    WHERE SUPP_ID = VAR_SUPP_ID; 

    IF SQL%NOTFOUND THEN 
     DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND'); 
    ELSIF SQL%FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('DATA FOUND'); 
    END IF;  
END; 
+0

を私はヒキガエルで01403エラーが発生しますが、SQL%notfound..Why doesnの」として扱われませんsqlnotfoundが動作しています – user1050619

+1

あなたの質問にその情報を編集してください。 (そして、いつ何が起こっているのか、あなたが投稿したときに、あなたが将来どのようなエラーに直面しているのか、いつも正確に言う。 – Mat

答えて

13

:select文が何を返した場合ので

DECLARE 
    VAR_SUPP_NM VARCHAR2(100); 
    VAR_SUPP_ID NUMBER := 1; 
    WHILE_VAR CHAR := 'Y'; 
BEGIN 
    SELECT SUPP_NM 
    INTO VAR_SUPP_NM 
    FROM TEST.SUPPLIER 
    WHERE SUPP_ID = VAR_SUPP_ID; 

DBMS_OUTPUT.PUT_LINE('DATA FOUND'); 

exception 
    when no_data_found 
    then DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND'); 

END; 

SQL%FOUNDまたはSQL%NOTFOUNDを確認するには、select into文の場合には意味を持ちません行は常にno_data_found例外を発生させます。ただし、select文が集約関数を呼び出す場合は、常にデータが返されます。行が選択されていない場合はnullが返されます。

varcharデータ型を使用しないでください。代わりにvarchar2データ型を使用してください。

2

SELECT INTOを使用する場合は、ニコラスの回答が必要です。それはあなたが%FOUND%NOTFOUNDを使用することができることがより重要である場合は、代わりにカーソルからINGのFETCHを考慮してください。

DECLARE 
    VAR SUPP_NM VARCHAR2(100); 
    VAR_SUPP_ID NUMBER := 1; 
    WHILE_VAR CHAR := 'Y'; 
    CURSOR c1 IS 
     SELECT SUPP_NM 
     FROM TEST.SUPPLIER 
     WHERE SUPP_ID = VAR_SUPP_ID; 
BEGIN 
    OPEN c1; 
    FETCH c1 INTO VAR_SUPP_NM; 

    IF c1%NOTFOUND THEN 
      DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND'); 
    ELSIF c1%FOUND THEN 
      DBMS_OUTPUT.PUT_LINE('DATA FOUND'); 
    END IF; 

    CLOSE c1; 
END;