1. ホーム
  2. oracle

[解決済み] pl sql %NOTFOUND

2022-02-15 01:04:48

質問

このコードの一部が動作しないのはなぜでしょうか。私はサプライヤーを持っていません id=1 をテーブルの中に入れています。

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;

Toad で 01403 エラーが発生するが、処理されない。 sql%notfound .

なぜ sql%notfound は機能していますか?

解決方法は?

をキャッチするために NO_DATA_FOUND を追加して、次のようにコードを書き直します。 exception セクションを作成します。

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 なぜなら、select 文が行を返さない場合、常に no_data_found ただし、select文が集約関数を呼び出す場合は、行が選択されていなければ常にデータまたはnullを返します。

を使用しないでください。 varchar データ型を使用します。 varchar2 のデータ型を使用します。