Gestion des exceptions dans Oracle PL/SQL (exemples)
⚡ Résumé intelligent
Gestion des exceptions dans Oracle PL/SQL capture les erreurs d'exécution qui empêchent un bloc de s'exécuter, permettant au moteur de transférer le contrôle à une section EXCEPTION où les gestionnaires prédéfinis, définis par l'utilisateur et OTHERS répondent, lèvent ou propagent les erreurs en toute sécurité.
Qu’est-ce que la gestion des exceptions en PL/SQL ?
Une exception se produit lorsque le moteur PL/SQL rencontre une instruction qu'il ne peut exécuter en raison d'une erreur survenue à l'exécution. Ces erreurs ne sont pas détectées à la compilation et doivent donc être gérées uniquement à l'exécution.
Par exemple, si le moteur PL/SQL reçoit une instruction de division par zéro, il génère une exception. Cette exception est levée uniquement lors de l'exécution par le moteur PL/SQL.
Une exception interrompt l'exécution du programme. Pour éviter cela, il est nécessaire de capturer et de gérer l'erreur séparément. Ce processus, appelé gestion des exceptions, permet au programmeur de traiter les erreurs susceptibles de survenir lors de l'exécution.
Syntaxe de gestion des exceptions
Les exceptions sont gérées au niveau du bloc. Lorsqu'une exception survient dans un bloc, le contrôle quitte la partie d'exécution de ce bloc et l'exception est alors traitée dans la partie de gestion des exceptions du bloc. Une fois l'exception traitée, le contrôle ne peut plus revenir à la partie d'exécution de ce même bloc.
L'illustration ci-dessous montre comment la section d'exécution et la section de gestion des exceptions sont intégrées dans un seul bloc PL/SQL :
La syntaxe ci-dessous explique comment intercepter et gérer une exception.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Explication de la syntaxe :
- Dans la syntaxe ci-dessus, le bloc de gestion des exceptions contient une série de conditions WHEN pour gérer les exceptions.
- Chaque condition WHEN est suivie d'un nom d'exception qui devrait être levée lors de l'exécution.
- Lorsqu'une exception est levée lors de l'exécution, le moteur PL/SQL recherche cette exception particulière dans la partie de gestion des exceptions, en commençant par la première clause WHEN et en progressant séquentiellement.
- S'il trouve un gestionnaire pour l'exception levée, il exécute le code de ce gestionnaire.
- Si aucune clause WHEN ne correspond à l'exception levée, le moteur PL/SQL exécute la partie WHEN OTHERS, si elle est présente. Ce gestionnaire est commun à toutes les exceptions.
- Une fois le gestionnaire exécuté, le contrôle quitte le bloc actuel.
- Un seul gestionnaire d'exceptions peut être exécuté pour un bloc donné lors de l'exécution. Une fois cette exception exécutée, le moteur ignore les gestionnaires restants et quitte le bloc courant.
À noter: L'instruction WHEN OTHERS doit toujours être placée en dernier dans la séquence. Tout gestionnaire écrit après WHEN OTHERS ne sera jamais exécuté, car le contrôle quitte le bloc une fois que WHEN OTHERS a été exécuté.
Types d'exceptions
Il existe deux types d'exceptions dans PL / SQL.
- Exceptions prédéfinies
- Exceptions définies par l'utilisateur
Exceptions prédéfinies
Oracle a prédéfini certaines exceptions courantes. Chaque exception prédéfinie possède un nom et un numéro d'erreur uniques, et toutes sont déclarées dans le package STANDARD. OracleDans le code, vous pouvez utiliser directement ces noms d'exceptions prédéfinis pour gérer les erreurs correspondantes. Nombre d'entre eux correspondent directement à des exceptions courantes. SQL Les erreurs que vous rencontrez tous les jours.
Voici quelques exceptions prédéfinies :
| Exception | Erreur Code | Raison de l'exception |
|---|---|---|
| ACCESS_INTO_NULL | ORA-06530 | Attribuer une valeur aux attributs d'un objet non initialisé |
| CASE_NOT_FOUND | ORA-06592 | Aucune des clauses WHEN d'une instruction CASE n'est satisfaite et aucune clause ELSE n'est spécifiée. |
| COLLECTION_IS_NULL | ORA-06531 | L'utilisation des méthodes de collection (à l'exception de EXISTS) ou l'accès aux attributs d'une collection non initialisée |
| CURSOR_ALREADY_OPEN | ORA-06511 | Essayer d'ouvrir un curseur qui est déjà ouvert |
| DUP_VAL_ON_INDEX | ORA-00001 | Stockage d'une valeur en double dans une colonne de base de données contrainte par un index unique |
| INVALID_CURSOR | ORA-01001 | Opérations de curseur illégales, telles que la fermeture d'un curseur non ouvert |
| NUMÉRO INVALIDE | ORA-01722 | La conversion d'un caractère en nombre a échoué en raison d'un caractère numérique invalide. |
| AUCUNE DONNÉE DISPONIBLE | ORA-01403 | Une instruction SELECT contenant une clause INTO ne récupère aucune ligne. |
| ROW_MISMATCH | ORA-06504 | Le type de données de la variable de curseur est incompatible avec le type de retour réel du curseur. |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Faire référence à une collection par un numéro d'index supérieur à la taille de la collection |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Faire référence à une collection par un numéro d'index hors de la plage légale (par exemple, -1) |
| TOO_MANY_ROWS | ORA-01422 | Une instruction SELECT avec une clause INTO renvoie plusieurs lignes |
| VALUE_ERROR | ORA-06502 | Une erreur de calcul ou de contrainte de taille (par exemple, l'attribution d'une valeur supérieure à la taille de la variable) |
| ZERO_DIVIDE | ORA-01476 | Diviser un nombre par zéro |
Exception définie par l'utilisateur
Outre les exceptions prédéfinies mentionnées ci-dessus, un programmeur peut créer et gérer des exceptions personnalisées. Celles-ci sont créées au niveau du sous-programme, dans la partie déclaration, et ne sont visibles qu'à l'intérieur de ce sous-programme. Une exception définie dans la spécification d'un package est une exception publique et est visible partout où le package est accessible.
Syntaxe : Au niveau du sous-programme
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- Dans la syntaxe ci-dessus, la variable 'exception_name' est définie comme étant de type EXCEPTION.
- Elle peut alors être utilisée de la même manière qu'une exception prédéfinie.
Syntaxe : Au niveau de la spécification du paquet
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- Dans la syntaxe ci-dessus, la variable « exception_name » est définie comme le type EXCEPTION dans la spécification du package de .
- Il peut être utilisé dans toute la base de données, partout où le package « nom_du_package » peut être appelé.
PL/SQL déclenche une exception
Toutes les exceptions prédéfinies sont levées implicitement lorsqu'une erreur se produit. En revanche, les exceptions définies par l'utilisateur doivent être levées explicitement à l'aide du mot-clé RAISE. RAISE peut être utilisé de différentes manières, comme indiqué ci-dessous.
Si RAISE est utilisé seul dans un gestionnaire, il propage l'exception déjà levée au bloc parent. Il ne peut être utilisé qu'à l'intérieur d'un bloc d'exception, comme illustré ci-dessous.
La capture d'écran ci-dessous montre l'utilisation de RAISE seule pour relancer une exception dans le bloc englobant :
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Explication de la syntaxe :
- Dans la syntaxe ci-dessus, le mot-clé RAISE est utilisé à l'intérieur du bloc de gestion des exceptions.
- Lorsque le programme rencontre l'exception « nom_de_l'exception », celle-ci est gérée et le programme s'exécute normalement.
- Le mot-clé RAISE dans le gestionnaire propage ensuite cette même exception au programme parent.
À noter: Lorsqu'une exception est levée dans le bloc parent, l'exception levée doit également être visible dans le bloc parent ; sinon Oracle renvoie une erreur.
Vous pouvez également utiliser le mot-clé RAISE suivi du nom d'une exception pour déclencher cette exception, qu'elle soit définie par l'utilisateur ou prédéfinie. Cette syntaxe est valable aussi bien pour l'exécution que pour la gestion des exceptions.
La capture d'écran ci-dessous montre RAISE suivi d'un nom d'exception pour lever une exception spécifique :
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Explication de la syntaxe :
- Dans la syntaxe ci-dessus, le mot-clé RAISE est utilisé dans la partie exécution, suivi de l'exception 'nom_exception'.
- Cela provoque cette exception particulière lors de l'exécution, et celle-ci doit ensuite être gérée ou levée ultérieurement.
Exemple 1: Dans cet exemple, nous verrons :
- Comment déclarer une exception
- Comment lever l'exception déclarée
- Comment le propager au bloc principal
La capture d'écran ci-dessous montre le bloc complet qui déclare sample_exception, la lève à l'intérieur d'un bloc imbriqué et la propage au bloc principal :
La capture d'écran suivante montre la suite du même exemple, où le bloc principal capture finalement l'exception propagée :
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line('Inside nested block'); Dbms_output.put_line('Raising sample_exception from nested block'); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in nested block. Raising to main block'); RAISE; END; BEGIN Dbms_output.put_line('Inside main block'); Dbms_output.put_line('Calling nested block'); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in main block'); END; /
Code Explication:
- Code ligne 2: Déclarer la variable 'sample_exception' comme étant de type EXCEPTION.
- Code ligne 3: Déclaration de la procédure nested_block.
- Code ligne 6: Impression du message « À l’intérieur d’un bloc imbriqué ».
- Code ligne 7: Affichage du message « Lèvement de sample_exception à partir d'un bloc imbriqué ».
- Code ligne 8: Déclenchement de l'exception à l'aide de 'RAISE sample_exception'.
- Code ligne 10: Gestionnaire d'exceptions pour l'exception sample_exception dans le bloc imbriqué.
- Code ligne 11: Affichage du message « Exception capturée dans un bloc imbriqué. Remontée au bloc principal ».
- Code ligne 12: Provoquer l'exception dans le bloc principal (la propager).
- Code ligne 15: Impression du message « À l’intérieur du bloc principal ».
- Code ligne 16: Impression de l'instruction « Appel du bloc imbriqué ».
- Code ligne 17: Appel de la procédure nested_block.
- Code ligne 19: Gestionnaire d’exceptions pour sample_exception dans le bloc principal.
- Code ligne 20: Affichage du message « Exception capturée dans le bloc principal ».
Points importants à noter dans Exception
- Dans une fonction, une exception doit toujours soit renvoyer une valeur, soit propager l'exception ; sinon Oracle génère une erreur « Fonction renvoyée sans valeur » lors de l'exécution.
- Déclarations de contrôle des transactions peut être émise à l'intérieur du bloc de gestion des exceptions.
- SQLERRM et SQLCODE sont des fonctions intégrées qui renvoient respectivement le message d'exception et le code d'exception.
- Si une exception n'est pas gérée, toutes les transactions actives de cette session sont annulées par défaut.
- RAISE_APPLICATION_ERROR (- , L'instruction `r` peut être utilisée à la place de `RAISE` pour générer une erreur avec un code et un message personnalisés. Le code d'erreur doit être compris entre -20000 et -20999.






