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
- Definito dal sistema
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 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.