2012-10-25 12 views
8

Po prostu zastanawiam się, dlaczego ten fragment kodu nie działa. Nie mam identyfikatora dostawcy 1 w mojej tabeli.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

pojawia się błąd 01403 w ropuchę, ale nie traktować jako sql% notfound..Why robi” t sqlnotfound działa – user1050619

+1

Edytuj te informacje na swoje pytanie. (Zawsze mów dokładnie, co się dzieje/jaki błąd pojawia się w przyszłości bezpośrednio w pytaniu, kiedy go publikujesz.) To naprawdę ważne.) – Mat

Odpowiedz

13

złapać wyjątek NO_DATA_FOUND przepisać kod następująco dodając exception rozdział:

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; 

Sprawdzanie SQL%FOUND lub SQL%NOTFOUND nie mają znaczenia w przypadku select into oświadczeniu, ponieważ jeśli SELECT nie zwraca wiersze zawsze będą podnosić wyjątek no_data_found, z wyjątkiem tego, że jeśli instrukcja select wywoła funkcję agregującą, zawsze zwróci dane lub null, jeśli nie wybrano żadnych wierszy.

Nie należy używać typu danych varchar, należy zamiast tego używać typu varchar2.

2

Odpowiedź Nicholas jest tym, czego chcesz, jeśli chcesz użyć SELECT INTO. Jednakże, jeśli jest to bardziej ważne, że jesteś w stanie wykorzystać %FOUND lub %NOTFOUND rozważyć FETCH ing z kursorem zamiast:

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;