Quando allโinterno del nostro blocco PL/SQL si verifica un errore, o anche un avviso, viene scatenata unโeccezione. Le eccezioni possono essere distinte in due tipi:
- Eccezioni di sistema
- Eccezioni utente
Gli errori piรน generici che si possono verificare durante lโesecuzione di blocchi PL/SQL vengono gestiti dalle eccezioni di sistema. Esse si scatenano automaticamente quando si verificano i relativi errori. Le eccezioni utente invece devono essere esplicitamente definite e poi attivate dallโutente.
Vediamo di seguito la sintassi delle eccezioni:
DECLARE
...;
BEGIN
Istruzione1;
istruzione2:
...;
EXCEPTION
WHEN tipo_eccezione1 THEN
...;
WHEN tipo_eccezione2 THEN
...;
WHEN OTHERS THEN
...;
END;
In sostanza, abbiamo una sezione del blocco dedicata alle eccezioni; ogni qualvolta si verifica una eccezione, tramite le clausole WHEN viene individuata quella del tipo verificatosi in modo tale da eseguire il codice piรน opportuno alla sua gestione.
Dato che non sempre รจ possibile determinare tutte le eccezioni che si possono verificare a seguito dellโesecuzione del nostro codice, il PL/SQL mette a disposizione la clausola WHEN OTHERS la quale gestisce, appunto, tutte le eccezioni non esplicitamente trattate dalle clausole che la precedono.
Una clausola WHEN puรฒ anche gestire piรน eccezioni, avremo quindi qualcosa del genere:
WHEN tipo_eccezione1 OR tipo_eccezione2 THEN......
Di seguito, un piccolo elenco delle eccezioni di sistema piรน comuni:
- NO_DATA_FOUND โ un comando SELECT o FETCH non ha restituito nessuna tupla
- TOO_MANY_ROWS โ una SELECT INTO ha restituito piรน di una tupla
- ZERO_DIVIDE โ รจ stata tentata una divisione per 0
DECLARE
var_nome VARCHAR2;
BEGIN
SELECT Nome INTO var_nome FROM Anagrafica WHERE Cognome = 'TOPOLINO';
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO Log (Messaggio) VALUES ('Occorrenza non trovata.');
WHEN OTHERS THEN
null;
END;
Come giร accennato in precedenza, PL/SQL permette di definire delle exception proprie dellโutente. Come per qualsiasi altra dichiarazione, essa deve avvenire nella sezione di dichiarazione. Avremo quindi:
DECLARE
...;
mia_eccezione EXCEPTION;
...;
BEGIN
Istruzione1;
istruzione2;
...;
END;
Le eccezione definite dallโutente non scattano automaticamente ma devono essere scatenate tramite il comando RAISE seguito dal nome dellโeccezione, quindi, nel nostro caso avremo:
RAISE mia_eccezione;
Vediamo un esempio completo:
DECLARE
...;
Mia_eccezione EXCEPTION;
...;
BEGIN
Istruzione1;
istruzione2;
...;
IF condizione THEN
RAISE mia_eccezione;
END IF;
...;
EXCEPTION
WHEN tipo_eccezione1 THEN ...;
WHEN tipo_eccezione2 THEN ...;
WHEN mia_eccezione THEN ...;
WHEN OTHERS THEN ...;
END;