Che cos'è la gestione delle eccezioni in PL / SQL?
Si verifica un'eccezione quando il motore PL / SQL rileva un'istruzione che non può eseguire a causa di un errore che si verifica in fase di esecuzione. Questi errori non verranno catturati al momento della compilazione e quindi questi devono essere gestiti solo in fase di esecuzione.
Ad esempio, se il motore PL / SQL riceve un'istruzione per dividere un numero qualsiasi per "0", il motore PL / SQL la lancia come eccezione. L'eccezione viene sollevata solo in fase di esecuzione dal motore PL / SQL.
Le eccezioni interromperanno l'esecuzione del programma, quindi per evitare tale condizione, è necessario acquisirle e gestirle separatamente. Questo processo è chiamato gestione delle eccezioni, in cui il programmatore gestisce l'eccezione che può verificarsi in fase di esecuzione.
In questo tutorial imparerai i seguenti argomenti:
- Sintassi per la gestione delle eccezioni
- Tipi di eccezione
- Eccezioni predefinite
- Eccezione definita dall'utente
- Eccezione di aumento PL / SQL
- Punti importanti da notare in Exception
Sintassi per la gestione delle eccezioni
Le eccezioni vengono gestite a livello di blocco, cioè una volta che si verifica un'eccezione in un blocco, il controllo uscirà dalla parte di esecuzione di quel blocco. L'eccezione verrà quindi gestita nella parte di gestione delle eccezioni di quel blocco. Dopo aver gestito l'eccezione, non è possibile inviare nuovamente il controllo alla sezione di esecuzione di quel blocco.
La sintassi seguente spiega come rilevare e gestire l'eccezione.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Spiegazione della sintassi:
- Nella sintassi precedente, il blocco di gestione delle eccezioni contiene una serie di condizioni WHEN per gestire l'eccezione.
- Ogni condizione WHEN è seguita dal nome dell'eccezione che dovrebbe essere generata in fase di esecuzione.
- Quando viene sollevata un'eccezione in fase di esecuzione, il motore PL / SQL cercherà nella parte di gestione delle eccezioni quella particolare eccezione. Inizierà dalla prima clausola "WHEN" e, in sequenza, effettuerà la ricerca.
- Se ha trovato la gestione delle eccezioni per l'eccezione che è stata sollevata, eseguirà quella particolare parte di codice di gestione.
- Se nessuna delle clausole "WHEN" è presente per l'eccezione sollevata, il motore PL / SQL eseguirà la parte "WHEN OTHERS" (se presente). Questo è comune a tutte le eccezioni.
- Dopo aver eseguito l'eccezione, il controllo della parte uscirà dal blocco corrente.
- Solo una parte di eccezione può essere eseguita per un blocco in fase di esecuzione. Dopo averlo eseguito, il controller salterà la parte di gestione delle eccezioni rimanente e uscirà dal blocco corrente.
Nota: QUANDO OTHERS dovrebbe essere sempre nell'ultima posizione della sequenza. La parte di gestione delle eccezioni presente dopo WHEN OTHERS non verrà mai eseguita poiché il controllo uscirà dal blocco dopo aver eseguito WHEN OTHERS.
Tipi di eccezione
Esistono due tipi di eccezioni in Pl / SQL.
- Eccezioni predefinite
- Eccezione definita dall'utente
Eccezioni predefinite
Oracle ha predefinito alcune eccezioni comuni. Queste eccezioni hanno un nome di eccezione univoco e un numero di errore. Queste eccezioni sono già definite nel pacchetto "STANDARD" in Oracle. Nel codice, possiamo utilizzare direttamente questi nomi di eccezione predefiniti per gestirli.
Di seguito sono riportate le poche eccezioni predefinite
Eccezione | Codice di errore | Motivo dell'eccezione |
ACCESS_INTO_NULL | ORA-06530 | Assegna un valore agli attributi degli oggetti non inizializzati |
CASE_NOT_FOUND | ORA-06592 | Nessuna delle clausole "WHEN" nell'istruzione CASE è soddisfatta e non viene specificata alcuna clausola "ELSE" |
COLLECTION_IS_NULL | ORA-06531 | Utilizzo di metodi di raccolta (eccetto EXISTS) o accesso agli attributi di raccolta su raccolte non inizializzate |
CURSOR_ALREADY_OPEN | ORA-06511 | Tentativo di aprire un cursore già aperto |
DUP_VAL_ON_INDEX | ORA-00001 | Memorizzazione di un valore duplicato in una colonna del database vincolata da un indice univoco |
INVALID_CURSOR | ORA-01001 | Operazioni del cursore illegali come la chiusura di un cursore non aperto |
NUMERO NON VALIDO | ORA-01722 | La conversione del carattere in un numero non è riuscita a causa di un carattere numerico non valido |
NESSUN DATO TROVATO | ORA-01403 | Quando l'istruzione "SELECT" che contiene la clausola INTO non recupera alcuna riga. |
ROW_MISMATCH | ORA-06504 | Quando il tipo di dati della variabile del cursore non è compatibile con il tipo di ritorno del cursore effettivo |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Riferimento alla raccolta tramite un numero di indice maggiore della dimensione della raccolta |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Riferimento alla raccolta tramite un numero di indice che è al di fuori dell'intervallo legale (ad esempio: -1) |
TOO_MANY_ROWS | ORA-01422 | Quando un'istruzione "SELECT" con clausola INTO restituisce più di una riga |
VALUE_ERROR | ORA-06502 | Errore aritmetico o di vincolo di dimensione (ad esempio: assegnare un valore a una variabile che è maggiore della dimensione della variabile) |
ZERO_DIVIDE | ORA-01476 | Dividere un numero per "0" |
Eccezione definita dall'utente
In Oracle, oltre alle eccezioni predefinite sopra, il programmatore può creare le proprie eccezioni e gestirle. Possono essere creati a livello di sottoprogramma nella parte della dichiarazione. Queste eccezioni sono visibili solo in quel sottoprogramma. L'eccezione definita nella specifica del pacchetto è un'eccezione pubblica ed è visibile ovunque sia accessibile il pacchetto. <
Sintassi: a livello di sottoprogramma
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Nella sintassi precedente, la variabile "nome_eccezione" è definita come tipo "ECCEZIONE".
- Questo può essere utilizzato in modo simile come un'eccezione predefinita.
Sintassi: a livello di specifica del pacchetto
CREATE PACKAGEIS EXCEPTION;… END ;
- Nella sintassi precedente, la variabile "nome_eccezione" è definita come tipo "ECCEZIONE" nella specifica del pacchetto di
. - Può essere utilizzato nel database ovunque sia possibile chiamare il pacchetto "nome_pacchetto".
Eccezione di aumento PL / SQL
Tutte le eccezioni predefinite vengono sollevate implicitamente ogni volta che si verifica l'errore. Ma le eccezioni definite dall'utente devono essere sollevate esplicitamente. Ciò può essere ottenuto utilizzando la parola chiave "RAISE". Questo può essere utilizzato in uno dei modi menzionati di seguito.
Se 'RAISE' viene utilizzato separatamente nel programma, propagherà l'eccezione già sollevata al blocco genitore. Solo nel blocco delle eccezioni può essere utilizzato come mostrato di seguito.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Spiegazione della sintassi:
- Nella sintassi precedente, la parola chiave RAISE viene utilizzata nel blocco di gestione delle eccezioni.
- Ogni volta che il programma incontra l'eccezione "nome_eccezione", l'eccezione viene gestita e verrà completata normalmente
- Ma la parola chiave "RAISE" nella parte di gestione delle eccezioni propagherà questa particolare eccezione al programma padre.
Nota: mentre solleva l'eccezione al blocco genitore, l'eccezione che viene sollevata dovrebbe essere visibile anche al blocco genitore, altrimenti Oracle genererà un errore.
- Possiamo usare la parola chiave "RAISE" seguita dal nome dell'eccezione per sollevare quella particolare eccezione definita dall'utente / predefinita. Può essere utilizzato sia nella parte di esecuzione che nella parte di gestione delle eccezioni per sollevare l'eccezione.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Spiegazione della sintassi:
- Nella sintassi precedente, la parola chiave RAISE viene utilizzata nella parte di esecuzione seguita dall'eccezione "nome_eccezione".
- Ciò solleverà questa particolare eccezione al momento dell'esecuzione e questo deve essere gestito o aumentato ulteriormente.
Esempio 1 : in questo esempio, vedremo
- Come dichiarare l'eccezione
- Come sollevare l'eccezione dichiarata e
- Come propagarlo al blocco principale
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/
Spiegazione del codice:
- Riga di codice 2 : dichiarazione della variabile "sample_exception" come tipo EXCEPTION.
- Riga di codice 3 : dichiarazione di procedura nested_block.
- Riga di codice 6 : stampa dell'istruzione "Inside nested block".
- Riga di codice 7: stampa dell'istruzione "Raising sample_exception dal blocco nidificato".
- Riga di codice 8: generazione dell'eccezione utilizzando "RAISE sample_exception".
- Riga di codice 10: gestore di eccezioni per l'eccezione sample_exception nel blocco nidificato.
- Riga di codice 11: stampa dell'istruzione "Eccezione acquisita nel blocco nidificato. Alzando al blocco principale '.
- Riga di codice 12: aumento dell'eccezione al blocco principale (propagazione al blocco principale).
- Riga di codice 15: stampa dell'istruzione "Inside the main block".
- Riga di codice 16: stampa dell'istruzione "Calling nested block".
- Riga di codice 17: chiamata alla procedura nested_block.
- Riga di codice 19: gestore di eccezioni per sample_exception nel blocco principale.
- Riga di codice 20: stampa dell'istruzione "Eccezione acquisita nel blocco principale".
Punti importanti da notare in Exception
- Nella funzione, un'eccezione dovrebbe sempre restituire un valore o aumentare ulteriormente l'eccezione. altrimenti Oracle genererà l'errore "Funzione restituita senza un valore" in fase di esecuzione.
- Le istruzioni di controllo delle transazioni possono essere fornite nel blocco di gestione delle eccezioni.
- SQLERRM e SQLCODE sono le funzioni integrate che forniranno il messaggio e il codice di eccezione.
- Se un'eccezione non viene gestita, per impostazione predefinita verrà eseguito il rollback di tutte le transazioni attive in quella sessione.
- RAISE_APPLICATION_ERROR (-
, ) può essere utilizzato invece di RAISE per sollevare l'errore con il codice utente e il messaggio. Il codice di errore deve essere maggiore di 20000 e preceduto da "-".
Sommario
Dopo questo capitolo. dovresti essere in grado di lavorare per i seguenti aspetti delle eccezioni Pl SQL
- Gestire le eccezioni
- Definisci un'eccezione
- Solleva l'eccezione
- Propagazione delle eccezioni