2012-01-12 10 views
10

Attualmente sto imparando PL/SQL e attualmente sto lavorando con procedure ed eccezioni utilizzando lo schema Oracle HR.Eccezioni PL/SQL su aggiornamento/eliminazione di righe non esistenti

Ecco la mia semplice 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; 

Quando eseguo questa procedura l'uscita è

No such record 
    PL/SQL procedure successfully complete. 

Tuttavia, secondo il PDF Oracle dovrebbe generare un'eccezione e ho in realtà dovrebbe ottenere il messaggio sono entrato nel l'eccezione.

La stessa cosa è accaduta con l'aggiornamento sul record non esistente. Si prega di avvisare. Grazie

risposta

10

Credo che SQL%NOTFOUND restituisca true quando nessun record viene trovato. Il tuo IF valuterà per vero in tal caso, e quindi scrivi la tua put_line al terminale. L'istruzione SQL è stata eseguita correttamente. Se si esegue questa istruzione SQL da sola dalla riga di comando, si riceveranno 0 righe aggiornate/cancellate, non un errore Oracle.

Se si desidera generare un'eccezione, è possibile utilizzare RAISE all'interno di IF e indirizzarlo all'eccezione nel blocco di eccezioni che si desidera generare.

+0

grazie Volevo solo confermare non mancare nulla. – MStp

8

Non c'è alcuna "eccezione" - sql eseguito correttamente. Ha cancellato con successo ogni record che corrispondeva ai criteri ... che era 0 record. Stessa cosa se è stata eseguita una dichiarazione di aggiornamento simile. Hai usato SQL% NOTFOUND per determinare che non ci fossero record interessati, ma questo non significa che ci sia stata un'eccezione.

Forse stai pensando all'eccezione NO_DATA_FOUND sollevata se provi una clausola "seleziona in" e non trova alcun record corrispondente.

+0

Sì ho pensato lo stesso, ma "Oracle Database 11g Sviluppare PL/SQL programma Unità Vol1" pdf è stato affermando ci dovrebbe essere un'eccezione. Volevo solo confermare che non mi manca niente, grazie. – MStp

1

per farlo è necessario utilizzare

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

e definire il

Problemi correlati