2012-10-25 8 views
8

Ich frage mich nur, warum dieses Stück Code nicht funktioniert. Ich habe keine Lieferanten-ID = 1 in meiner Tabelle.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

Ich erhalte einen Fehler 01403 in Kröte, aber nicht als SQL behandelt% notfound..Why doesn‘ t sqlnotfound funktioniert – user1050619

+1

Bitte bearbeiten Sie diese Informationen in Ihre Frage. (Und sag immer genau was gerade passiert/welcher Fehler du in der Zukunft direkt in der Frage bekommst, wenn du es postest. Es ist wirklich wichtig.) – Mat

Antwort

13

fangen die NO_DATA_FOUND Ausnahme Code neu schreiben, wie durch das Hinzufügen exception Abschnitt folgt:

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; 

prüfen SQL%FOUND oder SQL%NOTFOUND im Fall von select into Aussage keine Bedeutung haben, denn wenn die select-Anweisung nicht zurückgibt Zeilen wird es immer no_data_found Ausnahme auslösen, außer wenn diese Select-Anweisung Aggregatfunktion aufruft, wird es immer Daten oder Null zurückgeben, wenn keine Zeilen ausgewählt wurde.

Verwenden Sie nicht den Datentyp varchar, verwenden Sie stattdessen den Datentyp varchar2.

2

Nicholas Antwort ist was Sie wollen, wenn Sie SELECT INTO verwenden möchten. Wenn es jedoch wichtiger ist, dass Sie in der Lage sind %FOUND oder %NOTFOUND zu verwenden, sollten Sie FETCH von einem Cursor ing statt:

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;