Database
 sql >> Database >  >> RDS >> Database

Scopri come gestire le eccezioni in PL/SQL

Se sei un programmatore, potresti avere familiarità con il concetto di gestione delle eccezioni che è parte integrante di qualsiasi linguaggio di programmazione. Poiché gli errori sono inevitabili e anche i più intelligenti di noi possono commettere errori durante la scrittura del codice, dobbiamo conoscere come gestirli. In questo articolo impareremo in particolare la gestione delle eccezioni in PL/SQL.

Di seguito sono riportati gli argomenti trattati in questo articolo:

  • Che cos'è un'eccezione?
  • Sintassi della gestione delle eccezioni
  • Tipi di eccezioni
    • Definito dal sistema
      • Eccezioni di sistema con nome
      • Eccezioni di sistema senza nome
    • Definito dall'utente
      • Passaggi per dichiarare le funzioni definite dall'utente
      • Esempi di funzioni definite dall'utente

Che cos'è un'eccezione?

Qualsiasi condizione o evento anormale che interrompe il normale flusso delle istruzioni del nostro programma in fase di esecuzione o, in parole semplici, un'eccezione è un errore.

Sintassi della gestione delle eccezioni in PL/SQL

DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2&nbsp; THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........

WHEN others THEN
exception3-handling-statements
END;

Qui possiamo elencare tutte le eccezioni che vogliamo gestire. L'eccezione predefinita verrà gestita utilizzando "QUANDO gli altri ALLORA"

Esempio di gestione delle eccezioni in PL/SQL

Il programma seguente mostra il nome e l'indirizzo di uno studente il cui ID è fornito. Poiché nel nostro database non sono presenti studenti con ID valore 8, il programma solleva l'eccezione di runtime NO_DATA_FOUND, che viene acquisita nel blocco EXCEPTION.

DECLARE 
   s_id studentS.id%type := 8; 
   s_name studentS.Name%type; 
   s_loc studentS.loc%type; 
BEGIN 
   SELECT  name, loation INTO  s_name, s_loc 
   FROM students 
   WHERE id = s_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  s_name); 
   DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc);
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such student!'); 
   WHEN others THEN 
      dbms_output.put_line('Oops, Error!'); 
END; 

Risultato

No such student!
PL/SQL procedure successfully completed.  

Qui possiamo elencare tutte le eccezioni che vogliamo gestire. L'eccezione predefinita verrà gestita utilizzando "QUANDO gli altri ALLORA '

Tipi di eccezioni in PL/SQL

  • Definito dal sistema
  • Utente sfidato

In questo articolo sulla gestione delle eccezioni in PL/SQL, discutiamo in dettaglio di entrambi questi tipi.

Definito dal sistema

Definite e mantenute in modo implicito dal server Oracle, queste eccezioni sono principalmente definite nell'Oracle Standard Package. Ogni volta che si verifica un'eccezione all'interno del programma, il server Oracle abbina e identifica l'eccezione appropriata dal set di eccezioni disponibile nel pacchetto standard Oracle. Fondamentalmente, queste eccezioni sono predefinite in PL/SQL che viene sollevata QUANDO viene violata una particolare regola del database .

Le eccezioni definite dal sistema sono ulteriormente suddivisi in due categorie:

  • Eccezioni di sistema con nome
  • Eccezioni di sistema senza nome

Eccezioni di sistema denominato

Le eccezioni PL/SQL denominate sono denominate nel pacchetto standard di PL/SQL , quindi lo sviluppatore non ha bisogno di definire le eccezioni PL/SQL nel proprio codice. PL/SQL fornisce molte eccezioni denominate predefinite, che vengono eseguite quando una qualsiasi regola del database viene violata da un programma. La tabella seguente elenca alcune delle importanti eccezioni predefinite −

Eccezione Errore Oracle SQLCODE Descrizione
ACCESS_INTO_NULL 06530 -6530 Viene generato quando a un oggetto null viene assegnato automaticamente un valore.
CASO_NON_TROVATO 06592 -6592 Viene generato quando nessuna delle scelte nella clausola WHEN di un'istruzione CASE è selezionata e non è presente alcuna clausola ELSE.
COLLECTION_IS_NULL 06531 -6531 Viene generato quando un programma tenta di applicare metodi di raccolta diversi da EXISTS a una tabella nidificata o varray non inizializzata, oppure il programma tenta di assegnare valori agli elementi di una tabella nidificata o varray non inizializzata.
DUP_VAL_ON_INDEX 00001 -1 Viene generato quando si tenta di memorizzare valori duplicati in una colonna con un indice univoco.
CURSOR_INVALID 01001 -1001 Viene generato quando si tenta di eseguire un'operazione sul cursore non consentita, come la chiusura di un cursore non aperto.
NUMERO_INVALIDO 01722 -1722 Viene generato quando la conversione di una stringa di caratteri in un numero non riesce perché la stringa non rappresenta un numero valido.
LOGIN_DENIED 01017 -1017 Viene generato quando un programma tenta di accedere al database con un nome utente o una password non validi.
NESSUN DATO_TROVATO 01403 +100 Viene generato quando un'istruzione SELECT INTO non restituisce righe.
NON_LOGGED_ON 01012 -1012 Viene generato quando viene emessa una chiamata al database senza essere connessi al database.
ERRORE_PROGRAMMA 06501 -6501 Viene generato quando PL/SQL ha un problema interno.
ROWTYPE_MISMATCH 06504 -6504 Viene generato quando un cursore recupera un valore in una variabile con un tipo di dati incompatibile.
SELF_IS_NULL 30625 -30625 Viene generato quando viene richiamato un metodo membro, ma l'istanza del tipo di oggetto non è stata inizializzata.
STORAGE_ERROR 06500 -6500 Viene generato quando PL/SQL esaurisce la memoria o la memoria è danneggiata.
TOO_MANY_ROWS 01422 -1422 Viene generato quando un'istruzione SELECT INTO restituisce più di una riga.
VALUE_ERROR 06502 -6502 Viene generato quando si verifica un errore aritmetico, di conversione, di troncamento o di vincolo di dimensione.
ZERO_DIVIDE 01476 1476 Viene generato quando si tenta di dividere un numero per zero.

Esempio

CREATE OR REPLACE PROCEDURE add_new_student
      (student _id_in IN NUMBER, student _name_in IN VARCHAR2)
IS
BEGIN
       INSERT INTO student (student _id, student _name )
       VALUES ( student _id_in, student _name_in );
EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN
 raise_application_error (-20001,'Duplicate student _id');
       WHEN OTHERS THEN
raise_application_error (-20002,'An error occurred.');
END;

Proseguendo in questo articolo sulla gestione delle eccezioni in PL/SQL, cerchiamo di capire cosa sono le eccezioni di sistema senza nome.

Eccezioni di sistema senza nome

Le eccezioni di sistema per le quali Oracle non ha un nome sono note come eccezioni di sistema senza nome. Queste eccezioni non si verificano frequentemente e vengono scritte con un codice e un messaggio associato.

Ci sono fondamentalmente due modi per gestire le eccezioni di sistema senza nome:

1. Utilizzo del gestore di eccezioni WHEN OTHERS

2. Associare il codice di eccezione a un nome e utilizzarlo come eccezione denominata.

Alcuni passaggi seguiti per le eccezioni di sistema senza nome sono:

  • Alzali implicitamente.
  • Nel caso in cui non vengano gestiti in "QUANDO altri", devono essere gestiti in modo esplicito.
  • Per gestire l'eccezione in modo esplicito, possono essere dichiarate utilizzando Pragma EXCEPTION_INIT e gestite facendo riferimento al nome dell'eccezione definito dall'utente nella sezione dell'eccezione.

Un esempio di gestione delle eccezioni senza nome utilizzando Pragma EXCEPTION_INIT viene fornito più avanti nell'articolo. Proseguendo in questo articolo sulla gestione delle eccezioni in PL/SQL, cerchiamo di comprendere le eccezioni definite dall'utente.

Definito dall'utente

Come tutti gli altri linguaggi di programmazione, anche Oracle ti consente di dichiarare e implementare le tue eccezioni. A differenza delle eccezioni definite dal sistema, queste eccezioni vengono sollevate esplicitamente nel blocco PL/SQL.

Passaggi per dichiarare le eccezioni definite dall'utente nel database Oracle

Possiamo definire eccezioni definite dall'utente nel database Oracle nei seguenti 3 modi:

  • Utilizzo di una variabile di tipo EXCEPTION

Qui, possiamo dichiarare un'eccezione definita dall'utente dichiarando una variabile di tipo di dati EXCEPTION nel nostro codice e sollevarla esplicitamente nel nostro programma usando l'istruzione RAISE.

  • Utilizzo della funzione PRAGMA EXCEPTION_INIT

Possiamo definire un numero di errore non predefinito con la variabile di tipo di dati EXCEPTION

  • Utilizzo del metodo RAISE_APPLICATION_ERROR

Utilizzando questo metodo, possiamo dichiarare un'eccezione definita dall'utente con il nostro numero di errore e messaggio personalizzati.

Finora potresti avere un'idea approssimativa dei modi in cui possiamo sollevare eccezioni definite dall'utente in PL/SQL. Approfondiremo ciascuno dei metodi sopra menzionati con esempi più avanti in questo articolo sulla gestione delle eccezioni in PL/SQL.

In questo articolo, procediamo con le dimostrazioni della gestione delle eccezioni definite dall'utente.

Dimostrazione di eccezioni definite dall'utente

Proseguendo in questo articolo sulla gestione delle eccezioni in PL/SQL, vediamo come utilizzare la variabile di tipo EXCEPTION.

Utilizzo di una variabile di tipo EXCEPTION

Il processo di dichiarazione dell'eccezione definita dall'utente è diviso in tre parti e queste 3 parti sono:

  • Dichiara un tipo di dati di eccezione variabile
  • Sollevare l'eccezione
  • Gestisci l'eccezione

Scriviamo un codice per dimostrare in dettaglio i passaggi precedenti.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

Nel blocco di dichiarazione sopra, abbiamo quattro variabili, tra le quali le prime tre sono normali variabili di tipo di dati numerico e la quarta che è ex_DivZero è la speciale variabile di tipo di dati di eccezione. La quarta è la nostra eccezione definita dall'utente.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

La parte di esecuzione sopra di questo blocco anonimo, entrerà in azione solo quando il divisore è 0. Se il divisore è zero come nel nostro caso, verrà sollevato l'errore e il controllo del programma salterà tutti i passaggi successivi e cercherà un gestore di eccezioni corrispondente. Nel caso in cui ne trovi un altro, eseguirà l'azione di conseguenza, altrimenti terminerà il programma o ci avviserà con un errore definito dal sistema non gestito.

EXCEPTION WHEN ex_DivZero THEN
DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);

Questo è il gestore delle eccezioni. Non appena l'utente inserisce divisore come 0, verrà richiesta la stringa di messaggio sopra.

Codice finale:

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
END;

Proseguendo in questo articolo sulla gestione delle eccezioni in PL/SQL, cerchiamo di capire come utilizzare il metodo PRAGMA_EXCEPTION_INIT.

Utilizzo della funzione PRAGMA EXCEPTION_INIT

Nella funzione PRAGMA EXCEPTION_INIT, un nome di eccezione è associato a un numero di errore Oracle. Questo nome può essere utilizzato nella progettazione del gestore delle eccezioni per l'errore. Per progetti di grandi dimensioni con molti errori definiti dall'utente, PRAGMA EXCEPTION_INIT è il metodo più utile e adatto.

Sintassi:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

Esempio

DECLARE
   deadlock_detected EXCEPTION;
   PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
 NULL; -- Some operation that causes an ORA-00060 error
EXCEPTION
   WHEN deadlock_detected THEN
      NULL; -- handle the error
END;

PRAGMA EXCEPTION_INIT dice al compilatore di associare un nome di eccezione a un numero di errore Oracle come menzionato in precedenza. Ti consente di fare riferimento a qualsiasi eccezione interna per nome e di scrivere un gestore specifico per essa. Quando vedi uno stack di errori, o una sequenza di messaggi di errore, quello in alto è quello che può essere intrappolato e gestito.

Proseguendo in questo articolo sulla gestione delle eccezioni in PL/SQL, cerchiamo di capire come utilizzare il metodo RAISE_APPLICATION_ERROR.

Utilizzo del metodo RAISE_APPLICATION_ERROR

È una procedura integrata nel software Oracle. Utilizzando questa procedura possiamo associare un numero di errore a un messaggio di errore personalizzato. Combinando sia il numero di errore che il messaggio di errore personalizzato, è possibile comporre una stringa di errore simile a quelle stringhe di errore predefinite visualizzate da Oracle quando si verifica un errore. La procedura RAISE_APPLICATION_ERROR si trova all'interno del pacchetto DBMS_STANDARD

Sintassi

raise_application_error (error_number, message [, {TRUE | FALSE}]);

Esempio

/* A trigger trg_emp_detail_chk is created.*/
CREATE OR REPLACE TRIGGER trg_emp_detail_chk

/* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/
Before UPDATE ON employees

DECLARE
permission_denied EXCEPTION;
BEGIN

/*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/
IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN
raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!');

/* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter
with a default text stating that the user is not authorized to do any modification in the weekends. */
END IF;
END;

Con questo arriviamo alla fine di questo articolo su "Gestione delle eccezioni in PL/SQL". Spero che questo argomento sia stato compreso bene e ti sia stato di aiuto. Prova a scrivere i tuoi codici e incorpora i metodi spiegati in questo articolo.

Se vuoi essere formato da professionisti su questa tecnologia, puoi optare per una formazione strutturata di edureka! Dai un'occhiata a questo corso di certificazione MySQL DBA di Edureka, un'azienda di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Questo corso ti insegna i concetti fondamentali e gli strumenti e le tecniche avanzati per gestire i dati e amministrare il database MySQL. Include l'apprendimento pratico su concetti come MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Database Design, MySQL Command line, MySQL Functions ecc. Alla fine della formazione sarai in grado di creare e amministrare il tuo database MySQL e gestirlo dati.

Hai una domanda per noi? Si prega di menzionarlo nella sezione commenti di questo articolo "Gestione delle eccezioni in PL/SQL" e ti risponderemo il prima possibile.