2012-01-12 4 views
10

Obecnie uczę się PL/SQL i obecnie pracuję z procedurami i wyjątkami korzystając ze schematu HR Oracle.Wyjątki PL/SQL dla aktualizacji/usunięcia nieistniejącego wiersza

Oto moja prosta procedura.

create or replace 
PROCEDURE DEL_JOB 
(p_jobid jobs.job_id%TYPE) 
AS 
sqle NUMBER; 
sqlm VARCHAR2(300); 
BEGIN 
DELETE FROM JOBS 
WHERE JOB_ID = UPPER(p_jobid); 
IF SQL%NOTFOUND THEN 
    DBMS_OUTPUT.PUT_LINE('No such record'); 
END IF; 
EXCEPTION 
WHEN OTHERS THEN 
    sqle := SQLCODE; 
    sqlm := SQLERRM; 
    DBMS_OUTPUT.PUT_LINE('There is no job with this id that could be deleted'); 
    DBMS_OUTPUT.PUT_LINE('Error Code ='||sqle||' Error message =' ||sqlm); 
END; 

Kiedy wykonać tę procedurę, wyjście jest

No such record 
    PL/SQL procedure successfully complete. 

Jednak według Oracle PDF powinno wyjątek i powinien naprawdę się komunikat, że weszła w wyjątku.

To samo stało się z aktualizacją nieistniejącego rekordu. Proszę doradzić. Dzięki

Odpowiedz

10

Wierzę, że SQL%NOTFOUND zwraca true, gdy nie znaleziono rekordów. Twoja IF oceni w tym przypadku wartość true, a zatem wpisz put_line na terminal. Instrukcja SQL została wykonana pomyślnie. Jeśli wykonasz instrukcję SQL samodzielnie z wiersza poleceń, otrzymasz 0 wierszy zaktualizowanych/usuniętych, a nie błąd Oracle.

Jeśli chcesz mieć wyjątek, możesz użyć RAISE w swoim IF i wskazać wyjątek w bloku wyjątków, który chcesz rzucić.

+0

dziękuję Chciałem tylko potwierdzić, że niczego nie brakuje. – MStp

8

Nie ma "wyjątku" - sql wykonany pomyślnie. Pomyś lnie usunĘ ... ła każdy rekord pasujĘ ... cy do kryteriów ... czyli 0 rekordów. To samo, jeśli wykonano podobną instrukcję aktualizacji. Użyłeś SQL% NOTFOUND do stwierdzenia, że ​​nie ma żadnych zapisów, które zostały dotknięte, ale to nie znaczy, że był "wyjątek".

Być może myślisz o wyjątku NO_DATA_FOUND, jeśli wypróbujesz klauzulę "select into" i nie znajdziesz żadnych pasujących rekordów.

+0

Tak Pomyślałem to samo, ale "Database 11g Oracle Develop PL/SQL Program Units vol1" pdf stwierdzała nie powinno być wyjątkiem. Chciałem tylko potwierdzić, że niczego nie brakuje, dziękuję. – MStp

1

zrobić, więc trzeba użyć

IF SQL%ROWCOUNT = 0 THEN 
    RAISE no_delete; 
END IF; 

i określić swoją