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é.

  • ⚙️ Erreurs d'exécution : Une exception se produit lorsque le moteur PL/SQL rencontre une instruction qu'il ne peut pas exécuter, comme la division d'un nombre par zéro.
  • 🧱 Structure du bloc : Les exceptions sont gérées dans la section EXCEPTION à l'aide de clauses WHEN, les clauses WHEN OTHERS étant toujours placées en dernier.
  • 📚 Exceptions prédéfinies : Oracle Le package STANDARD répertorie les erreurs courantes telles que NO_DATA_FOUND et ZERO_DIVIDE, prêtes à être interceptées directement.
  • Exceptions définies par l'utilisateur : Les programmeurs déclarent leurs propres variables d'EXCEPTION et les lèvent explicitement avec le mot-clé RAISE.
  • ⬆️ Propagation: Une exception non gérée est transmise au bloc englobant, et RAISE la signale à un programme parent.
  • 🤖 Aide à l'IA : Les outils de codage IA génèrent des blocs EXCEPTION et signalent les chemins d'erreur non gérés lors de la révision.

Gestion des exceptions dans Oracle PL / SQL

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 :

Structure d'un bloc PL/SQL avec une section d'exécution et une section d'exception

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 :

Propagation d'une exception au bloc parent avec un simple RAISE

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 :

Lever une exception nommée spécifique avec RAISE suivi du nom de 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 '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 :

Exemple PL/SQL déclarant et levant une exception définie par l'utilisateur dans un bloc imbriqué

La capture d'écran suivante montre la suite du même exemple, où le bloc principal capture finalement l'exception propagée :

Résultat montrant l'exception capturée d'abord dans le bloc imbriqué, puis dans le 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;
/

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.

FAQ

PRAGMA EXCEPTION_INIT associe un nom d'exception déclaré par l'utilisateur à un élément spécifique Oracle Numéro d'erreur. Après la liaison, vous pouvez intercepter cette erreur ORA par son nom dans une clause WHEN au lieu d'utiliser WHEN OTHERS et de vérifier SQLCODE.

SQLCODE renvoie le code d'erreur numérique de l'exception courante, tandis que SQLERRM renvoie son message d'erreur. Ces deux fonctions sont appelées dans un gestionnaire d'exceptions, le plus souvent dans le bloc WHEN OTHERS, afin de consigner ou d'afficher le problème rencontré.

Évitez les clauses WHEN OTHERS qui masquent toutes les erreurs. Sans consigner les codes SQLCODE et SQLERRM ni relancer l'exception avec RAISE, elles dissimulent les bogues. Utilisez-les uniquement pour consigner les erreurs, nettoyer le système, puis propager l'exception.

RAISE_APPLICATION_ERROR accepte un numéro d'erreur compris entre -20000 et -20999 et un message d'une longueur maximale de 2048 octets. Elle interrompt l'exécution et renvoie une erreur personnalisée à l'application appelante, donnant ainsi à une condition définie par l'utilisateur l'apparence d'une erreur native. Oracle Erreur.

Pas dans le même bloc : une fois que le contrôle passe à la section EXCEPTION, ce bloc se termine. Pour continuer, placez l’instruction risquée dans un bloc BEGIN…EXCEPTION…END interne ; après la gestion de l’erreur, le bloc externe poursuit son exécution.

Une erreur est un problème survenant lors de l'exécution ou de la compilation du code. Une exception est le mécanisme d'exécution PL/SQL qui représente une erreur d'exécution, en transférant le contrôle à la section EXCEPTION afin que le programme puisse réagir au lieu de s'interrompre brutalement.

Oui. Les assistants IA et les analyseurs de code basés sur l'apprentissage automatique génèrent des blocs EXCEPTION, suggèrent les exceptions prédéfinies à intercepter et signalent les portions de code dépourvues de gestionnaires. Il est toutefois recommandé au développeur de vérifier la logique et les messages d'erreur avant le déploiement.

Copilote GitHub Il complète automatiquement les clauses WHEN, les appels RAISE_APPLICATION_ERROR et les blocs EXCEPTION complets à partir d'un court commentaire décrivant l'intention. Cela accélère le développement des gestionnaires de routines, mais les codes et messages d'erreur générés doivent être vérifiés pour garantir leur exactitude.

Résumez cet article avec :