Qu'est-ce que la gestion des exceptions dans 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 qui se produit au moment de l'exécution. Ces erreurs ne seront pas capturées au moment de la compilation et doivent donc être traitées uniquement au moment de l'exécution.
Par exemple, si le moteur PL / SQL reçoit une instruction pour diviser un nombre par «0», alors le moteur PL / SQL le lancera comme une 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 condition, elles doivent être capturées et traitées séparément. Ce processus est appelé traitement des exceptions, dans lequel le programmeur gère l'exception qui peut se produire au moment de l'exécution.
Dans ce didacticiel, vous apprendrez les sujets suivants:
- Syntaxe de gestion des exceptions
- Types d'exceptions
- Exceptions prédéfinies
- Exception définie par l'utilisateur
- Exception de levée PL / SQL
- Points importants à noter dans Exception
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 exécution de ce bloc. L'exception sera ensuite traité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… EXCEPTIONWHEN THEN WHEN OTHERSTHEN 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 dans la partie de gestion des exceptions cette exception particulière. Il commencera à partir de la première clause «WHEN» et, séquentiellement, il effectuera une recherche.
- S'il a trouvé 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 des clauses 'WHEN' n'est présente pour l'exception qui a été levée, alors le moteur PL / SQL exécutera la partie 'WHEN OTHERS' (si elle est présente). Ceci est commun à toutes les exceptions.
- Après avoir exécuté l'exception, le contrôle des pièces 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 son exécution, le contrôleur ignorera la partie de gestion des exceptions restante et sortira du bloc actuel.
Remarque: WHEN OTHERS 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 sortira du bloc après avoir exécuté 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 courante. 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' d'Oracle. Dans le code, nous pouvons directement utiliser ces noms d'exception prédéfinis pour les gérer.
Voici 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 | Utilisation de méthodes de collecte (sauf EXISTS) ou accès 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 dupliquée dans une colonne de base de données qui est 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 d'un 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' qui contient la clause INTO ne récupère aucune ligne. |
ROW_MISMATCH | ORA-06504 | Lorsque le type de données de variable de curseur est incompatible avec le type de retour de curseur réel |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | 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érence à la collection par un numéro d'index qui est en dehors de la plage légale (par exemple: -1) |
TOO_MANY_ROWS | ORA-01422 | Lorsqu'une instruction 'SELECT' avec la clause INTO renvoie plus d'une ligne |
VALUE_ERROR | ORA-06502 | Erreur d'arithmétique ou de contrainte de taille (par exemple: 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
Dans Oracle, à part les exceptions prédéfinies ci-dessus, le programmeur peut créer sa propre exception et la gérer. Ils peuvent être créés au niveau d'un sous-programme dans la partie déclaration. Ces exceptions ne sont visibles que dans ce sous-programme. L'exception définie dans la spécification du package est l'exception publique et elle est visible partout où le package est accessible. <
Syntaxe: Au niveau du sous-programme
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Dans la syntaxe ci-dessus, la variable «nom_exception» est définie comme du 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 PACKAGEIS EXCEPTION;… END ;
- Dans la syntaxe ci-dessus, la variable 'nom_exception' est définie comme du type 'EXCEPTION' dans la spécification de package de
. - Cela peut être utilisé dans la base de données partout où le package 'nom_package' peut être appelé.
Exception de levée PL / SQL
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à levée au bloc parent. Seul le bloc d'exception peut être utilisé comme indiqué ci-dessous.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN 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 "nom_exception", l'exception est gérée et se terminera normalement
- Mais le mot-clé 'RAISE' dans la partie de gestion des exceptions propagera cette exception particulière au programme parent.
Remarque: Lors de la levée de l'exception vers le bloc parent, l'exception qui est levée doit également être visible au niveau du bloc parent, sinon oracle lèvera une erreur.
- Nous pouvons utiliser le mot-clé 'RAISE' suivi du nom de l'exception pour lever 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 lever l'exception.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN 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 soulèvera cette exception particulière au moment de l'exécution, et cela doit être traité ou soulevé davantage.
Exemple 1 : Dans cet exemple, nous allons voir
- Comment déclarer l'exception
- Comment lever l'exception déclarée et
- Comment le propager au bloc principal
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:/
Explication du code:
- Ligne de code 2 : déclarer la variable 'sample_exception' comme type EXCEPTION.
- Ligne de code 3 : Procédure de déclaration nested_block.
- Ligne de code 6 : impression de l'instruction "Inside bloc imbriqué"
- Ligne de code 7: impression de l'instruction "Raising sample_exception from nested block."
- Ligne de code 8: déclencher 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 l'instruction 'Exception capturée dans le bloc imbriqué. Montée au bloc principal ».
- Ligne de code 12: lever l'exception au bloc principal (se propager au bloc principal).
- Ligne de code 15: Impression de l'instruction "À l'intérieur du bloc principal".
- Ligne de code 16: Impression de l'instruction "Appel d'un bloc imbriqué".
- Ligne de code 17: Appel de la procédure nested_block.
- Ligne de code 19: Gestionnaire d'exceptions pour sample_exception dans le bloc principal.
- Ligne de code 20: Impression de l'instruction "Exception capturée dans le bloc principal."
Points importants à noter dans Exception
- En fonction, une exception doit toujours renvoyer une valeur ou augmenter davantage l'exception. sinon Oracle lancera l'erreur «Fonction retournée sans valeur» au moment de l'exécution.
- Les instructions de contrôle de transaction peuvent être données au niveau du 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 signaler l'erreur avec le code utilisateur et le message. Le code d'erreur doit être supérieur à 20000 et précédé de «-».
Résumé
Après ce chapitre. vous devriez pouvoir travailler pour les aspects suivants des exceptions Pl SQL
- Gérer les exceptions
- Définir une exception
- Soulevez l'exception
- Propagation d'exception