Gestion des exceptions dans Oracle PL/SQL (exemples)
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 pas exécuter en raison d'une erreur survenant au moment de l'exécution. Ces erreurs ne seront pas capturées au moment de la compilation et ne devront donc être traitées qu'au moment de l'exécution.
Par exemple, si le moteur PL/SQL reçoit une instruction pour diviser n'importe quel nombre par « 0 », alors le moteur PL/SQL la lancera comme exception. L'exception n'est déclenchée qu'au moment de l'exécution par le moteur PL/SQL.
Les exceptions empêcheront le programme de s'exécuter davantage, donc pour éviter une telle situation, elles doivent être capturées et traitées séparément. Ce processus est appelé gestion des exceptions, dans lequel le programmeur gère l'exception qui peut se produire au moment de l'exécution.
Syntaxe de gestion des exceptions
Les exceptions sont gérées au niveau du bloc, c'est-à-dire qu'une fois qu'une exception se produit dans un bloc, le contrôle sortira de la partie d'exécution de ce bloc. L'exception sera ensuite gérée dans la partie de gestion des exceptions de ce bloc. Après avoir traité l'exception, il n'est pas possible de renvoyer le contrôle à la section d'exécution de ce bloc.
La syntaxe ci-dessous explique comment intercepter et gérer l'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 l'exception.
- Chaque condition WHEN est suivie du nom de l'exception qui devrait être déclenchée au moment de l'exécution.
- Lorsqu'une exception est déclenchée au moment de l'exécution, le moteur PL/SQL recherchera cette exception particulière dans la partie gestion des exceptions. Il commencera à partir de la première clause « WHEN » et, séquentiellement, il effectuera une recherche.
- S'il trouve la gestion d'exception pour l'exception qui a été déclenchée, il exécutera cette partie de code de gestion particulière.
- Si aucune clause 'WHEN' n'est présente pour l'exception qui a été déclenchée, alors le moteur PL/SQL exécutera la partie 'WHEN OTHERS' (si présente). Ceci est commun à toutes les exceptions.
- Après avoir exécuté l'exception, le contrôle partiel sortira du bloc actuel.
- Une seule partie d'exception peut être exécutée pour un bloc au moment de l'exécution. Après l'avoir exécuté, le contrôleur ignorera la partie restante de gestion des exceptions et sortira du bloc actuel.
Remarque: QUAND AUTRES doit toujours être à la dernière position de la séquence. La partie de gestion des exceptions présente après WHEN OTHERS ne sera jamais exécutée car le contrôle quittera le bloc après l'exécution de WHEN OTHERS.
Types d'exceptions
Il existe deux types d'exceptions dans PL/SQL.
- Exceptions prédéfinies
- Exception définie par l'utilisateur
Exceptions prédéfinies
Oracle a prédéfini une exception commune. Ces exceptions ont un nom d'exception et un numéro d'erreur uniques. Ces exceptions sont déjà définies dans le package 'STANDARD' de Oracle. Dans le code, nous pouvons directement utiliser ces noms d'exception prédéfinis pour les gérer.
Ci-dessous les quelques exceptions prédéfinies
Exception | Code d'erreur | Raison de l'exception |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | Attribuer une valeur aux attributs des objets non initialisés |
CASE_NOT_FOUND | ORA-06592 | Aucune des clauses "WHEN" de l'instruction CASE n'est satisfaite et aucune clause "ELSE" n'est spécifiée. |
COLLECTION_IS_NULL | ORA-06531 | Utiliser des méthodes de collection (sauf EXISTS) ou accéder aux attributs de collection sur des collections non initialisées |
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 comme la fermeture d'un curseur non ouvert |
NUMÉRO INVALIDE | ORA-01722 | La conversion du caractère en nombre a échoué en raison d'un caractère numérique non valide |
AUCUNE DONNÉE DISPONIBLE | ORA-01403 | Lorsque l'instruction 'SELECT' contenant la clause INTO ne récupère aucune ligne. |
ROW_MISMATCH | ORA-06504 | Lorsque le type de données de la variable du curseur est incompatible avec le type de retour réel du curseur |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Faire référence à la collection par un numéro d'index supérieur à la taille de la collection |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Référencer la collecte par un numéro d'index hors de la plage légale (ex : -1) |
TOO_MANY_ROWS | ORA-01422 | Lorsqu'une instruction 'SELECT' avec la clause INTO renvoie plus d'une ligne |
VALUE_ERROR | ORA-06502 | Erreur arithmétique ou de contrainte de taille (ex : attribuer une valeur à une variable plus grande que la taille de la variable) |
ZERO_DIVIDE | ORA-01476 | Diviser un nombre par '0' |
Exception définie par l'utilisateur
In Oracle, autres que les exceptions prédéfinies ci-dessus, le programmeur peut créer sa propre exception et les gérer. Ils peuvent être créés au niveau d'un sous-programme dans la partie déclaration. Ces exceptions sont visibles uniquement dans ce sous-programme. L'exception définie dans la spécification du package est une exception publique et elle 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 type 'EXCEPTION'.
- Cela peut être utilisé de la même manière qu’une exception prédéfinie.
syntaxe:Au niveau de la spécification du package
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- Dans la syntaxe ci-dessus, la variable 'nom_exception' est définie comme type 'EXCEPTION' dans la spécification du package de .
- Cela peut être utilisé dans la base de données partout où le package 'package_name' peut être appelé.
PL/SQL déclenche une exception
Toutes les exceptions prédéfinies sont déclenchées implicitement chaque fois que l'erreur se produit. Mais les exceptions définies par l'utilisateur doivent être déclenchées explicitement. Ceci peut être réalisé en utilisant le mot-clé « RAISE ». Cela peut être utilisé de l’une des manières mentionnées ci-dessous.
Si 'RAISE' est utilisé séparément dans le programme, alors il propagera l'exception déjà déclenchée au bloc parent. Seul le bloc d'exception peut être utilisé comme indiqué ci-dessous.
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é dans le bloc de gestion des exceptions.
- Chaque fois que le programme rencontre l'exception « exception_name », l'exception est gérée et se terminera normalement.
- Mais le mot-clé 'RAISE' dans la partie gestion des exceptions propagera cette exception particulière au programme parent.
Remarque: Lors de la levée de l'exception au bloc parent, l'exception déclenchée doit également être visible au niveau du bloc parent, sinon Oracle générera une erreur.
- Nous pouvons utiliser le mot-clé « RAISE » suivi du nom de l'exception pour déclencher cette exception particulière définie par l'utilisateur/prédéfinie. Cela peut être utilisé à la fois dans la partie exécution et dans la partie gestion des exceptions pour déclencher l’exception.
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 « exception_name ».
- Cela déclenchera cette exception particulière au moment de l'exécution, et cela doit être traité ou augmenté davantage.
Exemple 1: Dans cet exemple, nous allons voir
- Comment déclarer l'exception
- Comment déclencher l'exception déclarée et
- Comment le propager au bloc principal
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: /
Explication du code :
- Ligne de code 2: Déclaration de la variable 'sample_exception' comme type EXCEPTION.
- Ligne de code 3: Déclaration de la procédure nested_block.
- Ligne de code 6: Impression de l'instruction « À l'intérieur du bloc imbriqué ».
- Ligne de code 7 : Impression de l'instruction « Rising sample_exception from nested block ».
- Ligne de code 8 : Déclenchement de l'exception à l'aide de 'RAISE sample_exception'.
- Ligne de code 10 : Gestionnaire d’exceptions pour l’exception sample_exception dans le bloc imbriqué.
- Ligne de code 11 : Impression de la déclaration 'Exception capturée dans un bloc imbriqué. Montée au bloc principal.
- Ligne de code 12 : Lever l'exception au bloc principal (se propageant au bloc principal).
- Ligne de code 15 : Impression de la déclaration « À l'intérieur du bloc principal ».
- Ligne de code 16 : Impression de l'instruction « Appel du bloc imbriqué ».
- Ligne de code 17 : Appel de la procédure nested_block.
- Ligne de code 18 : Exception
- Ligne de code 19 : Gestionnaire d’exceptions pour sample_exception dans le bloc principal.
- Ligne de code 20 : Impression de la déclaration « Exception capturée dans le bloc principal ».
Points importants à noter dans Exception
- En fonction, une exception doit toujours soit renvoyer une valeur, soit augmenter davantage l'exception. autre Oracle lancera l'erreur « Fonction renvoyée sans valeur » au moment de l'exécution.
- Les instructions de contrôle des transactions peuvent être données au bloc de gestion des exceptions.
- SQLERRM et SQLCODE sont les fonctions intégrées qui donneront le message et le code d'exception.
- Si une exception n'est pas gérée, par défaut, toutes les transactions actives dans cette session seront annulées.
- RAISE_APPLICATION_ERROR (- , ) peut être utilisé à la place de RAISE pour générer l'erreur avec le code utilisateur et le message. Le code d'erreur doit être supérieur à 20000 et préfixé par « - ».
Résumé
Après ce chapitre. vous devriez être capable de travailler sur les aspects suivants de Pl SQL exceptions
- Gérer les exceptions
- Définir une exception
- Lever l'exception
- Propagation des exceptions