back to top

Gestire le eccezioni in PL/SQL – Guida Oracle

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
Vediamo adesso un semplice esempio che fa uso dell’eccezione NO_DATA_FOUND:
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;

Pubblicitร