Si vous êtes programmeur, vous connaissez peut-être le concept de gestion des exceptions qui fait partie intégrante de tout langage de programmation. Comme les erreurs sont inévitables et que même les plus intelligents d'entre nous peuvent faire des erreurs en écrivant du code, nous devons savoir comment les gérer. Dans cet article, nous aborderons plus particulièrement la gestion des exceptions en PL/SQL.
Voici les sujets abordés dans cet article :
- Qu'est-ce qu'une exception ?
- Syntaxe de la gestion des exceptions
- Types d'exceptions
- Défini par le système
- Exceptions système nommées
- Exceptions système sans nom
- Défini par l'utilisateur
- Étapes pour déclarer des fonctions définies par l'utilisateur
- Exemples de fonctions définies par l'utilisateur
- Défini par le système
Qu'est-ce qu'une exception ?
Toute condition ou événement anormal qui interrompt le flux normal de nos instructions de programme au moment de l'exécution ou, en termes simples, une exception est une erreur.
Syntaxe de la gestion des exceptions en PL/SQL
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN others THEN exception3-handling-statements END;
Ici, nous pouvons lister autant d'exceptions que nous voulons gérer. L'exception par défaut sera gérée en utilisant "WHEN other THEN"
Exemple de gestion des exceptions en PL/SQL
Le programme ci-dessous affiche le nom et l'adresse d'un étudiant dont l'ID est donné. Puisqu'il n'y a aucun étudiant avec la valeur ID 8 dans notre base de données, le programme lève l'exception d'exécution NO_DATA_FOUND, qui est capturée dans le bloc EXCEPTION.
DECLARE s_id studentS.id%type := 8; s_name studentS.Name%type; s_loc studentS.loc%type; BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| s_name); DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such student!'); WHEN others THEN dbms_output.put_line('Oops, Error!'); END;
Sortie
No such student! PL/SQL procedure successfully completed.
Ici, nous pouvons lister autant d'exceptions que nous voulons gérer. L'exception par défaut sera gérée en utilisant 'WHEN other THEN '
Types d'exceptions en PL/SQL
- Défini par le système
- Utilisateur défié
Dans cet article sur la gestion des exceptions en PL/SQL, discutons en détail de ces deux types.
Défini par le système
Définies et maintenues implicitement par le serveur Oracle, ces exceptions sont principalement définies dans le Oracle Standard Package. Chaque fois qu'une exception se produit dans le programme, le serveur Oracle correspond et identifie l'exception appropriée à partir de l'ensemble d'exceptions disponible dans le package standard Oracle. Fondamentalement, ces exceptions sont prédéfinies dans PL/SQL qui se déclenche LORSQUE la règle de base de données particulière est violée .
Les exceptions définies par le système sont divisés en deux catégories :
- Exceptions système nommées
- Exceptions système sans nom
Exceptions système nommées
Les exceptions PL/SQL nommées sont nommées dans le package standard de PL/SQL , le développeur n'a donc pas besoin de définir les exceptions PL/SQL dans son code. PL/SQL fournit de nombreuses exceptions nommées prédéfinies, qui sont exécutées lorsqu'une règle de base de données est violée par un programme. Le tableau suivant répertorie quelques-unes des exceptions prédéfinies importantes −
Exception | Erreur Oracle | SQLCODE | Description |
ACCESS_INTO_NULL | 06530 | -6530 | Il est déclenché lorsqu'un objet nul se voit automatiquement attribuer une valeur. |
CASE_NOT_FOUND | 06592 | -6592 | Il est déclenché lorsqu'aucun des choix de la clause WHEN d'une instruction CASE n'est sélectionné et qu'il n'y a pas de clause ELSE. |
COLLECTION_IS_NULL | 06531 | -6531 | Il est déclenché lorsqu'un programme tente d'appliquer des méthodes de collecte autres que EXISTS à une table ou un varray imbriqué non initialisé, ou que le programme tente d'attribuer des valeurs aux éléments d'une table ou d'un varray imbriqué non initialisé. |
DUP_VAL_ON_INDEX | 00001 | -1 | Il est déclenché lorsque des valeurs en double sont tentées d'être stockées dans une colonne avec un index unique. |
INVALID_CURSOR | 01001 | -1001 | Il est déclenché lorsque des tentatives sont faites pour effectuer une opération de curseur qui n'est pas autorisée, comme la fermeture d'un curseur non ouvert. |
INVALID_NUMBER | 01722 | -1722 | Il est levé lorsque la conversion d'une chaîne de caractères en nombre échoue car la chaîne ne représente pas un nombre valide. |
LOGIN_DENIED | 01017 | -1017 | Il est déclenché lorsqu'un programme tente de se connecter à la base de données avec un nom d'utilisateur ou un mot de passe invalide. |
NO_DATA_FOUND | 01403 | +100 | Il est déclenché lorsqu'une instruction SELECT INTO ne renvoie aucune ligne. |
NOT_LOGGED_ON | 01012 | -1012 | Il est déclenché lorsqu'un appel de base de données est émis sans être connecté à la base de données. |
PROGRAM_ERROR | 06501 | -6501 | Il est déclenché lorsque PL/SQL rencontre un problème interne. |
ROWTYPE_MISMATCH | 06504 | -6504 | Il est levé lorsqu'un curseur récupère une valeur dans une variable ayant un type de données incompatible. |
SELF_IS_NULL | 30625 | -30625 | Il est déclenché lorsqu'une méthode membre est invoquée, mais que l'instance du type d'objet n'a pas été initialisée. |
STORAGE_ERROR | 06500 | -6500 | Il est déclenché lorsque PL/SQL manque de mémoire ou que la mémoire est corrompue. |
TOO_MANY_ROWS | 01422 | -1422 | Il est déclenché lorsqu'une instruction SELECT INTO renvoie plus d'une ligne. |
VALUE_ERROR | 06502 | -6502 | Il est déclenché lorsqu'une erreur d'arithmétique, de conversion, de troncature ou de contrainte de taille se produit. |
ZERO_DIVIDE | 01476 | 1476 | Il est levé lorsqu'une tentative est faite pour diviser un nombre par zéro. |
Exemple
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
Passant à cet article sur la gestion des exceptions en PL/SQL, comprenons ce que sont les exceptions système sans nom.
Exceptions système sans nom
Les exceptions système pour lesquelles Oracle n'a pas de nom sont appelées exceptions système sans nom. Ces exceptions ne se produisent pas fréquemment et sont écrites avec un code et un message associé.
Il existe essentiellement deux façons de gérer les exceptions système sans nom :
1. Utilisation du gestionnaire d'exceptions WHEN OTHERS
2. Associer le code d'exception à un nom et l'utiliser comme exception nommée.
Certaines étapes suivies pour les exceptions système sans nom sont :
- Élevez-les implicitement.
- Dans le cas où ils ne sont pas traités dans "WHEN Others", ils doivent être traités explicitement.
- Pour gérer l'exception explicitement, elles peuvent être déclarées à l'aide de Pragma EXCEPTION_INIT et gérées en référençant le nom de l'exception défini par l'utilisateur dans la section exception.
Un exemple de gestion des exceptions sans nom à l'aide de Pragma EXCEPTION_INIT est fourni plus loin dans l'article. Passant à cet article sur la gestion des exceptions en PL/SQL, comprenons les exceptions définies par l'utilisateur.
Défini par l'utilisateur
Comme tous les autres langages de programmation, Oracle vous permet également de déclarer et d'implémenter vos propres exceptions. Contrairement aux exceptions définies par le système, ces exceptions sont déclenchées explicitement dans le bloc PL/SQL.
Étapes pour déclarer des exceptions définies par l'utilisateur dans la base de données Oracle
Nous pouvons définir des exceptions définies par l'utilisateur dans la base de données Oracle des 3 manières suivantes :
- Utilisation d'une variable de type EXCEPTION
Ici, nous pouvons déclarer une exception définie par l'utilisateur en déclarant une variable de type de données EXCEPTION dans notre code et en la déclenchant explicitement dans notre programme à l'aide de l'instruction RAISE.
- Utilisation de la fonction PRAGMA EXCEPTION_INIT
Nous pouvons définir un numéro d'erreur non prédéfini avec la variable de type de données EXCEPTION
- Utilisation de la méthode RAISE_APPLICATION_ERROR
En utilisant cette méthode, nous pouvons déclarer une exception définie par l'utilisateur avec notre propre numéro d'erreur et message personnalisés.
Jusqu'à présent, vous avez peut-être une idée approximative de la manière dont nous pouvons générer des exceptions définies par l'utilisateur en PL/SQL. Nous découvrirons chacune des méthodes mentionnées ci-dessus avec des exemples plus loin dans cet article sur la gestion des exceptions en PL/SQL.
Dans la suite de cet article, passons aux démonstrations de la gestion des exceptions définies par l'utilisateur.
Démonstration des exceptions définies par l'utilisateur
En poursuivant dans cet article sur la gestion des exceptions en PL/SQL, voyons comment utiliser la variable de type EXCEPTION.
Utilisation d'une variable de type EXCEPTION
Le processus de déclaration d'une exception définie par l'utilisateur est divisé en trois parties et ces 3 parties sont :
- Déclarer un type de données d'exception variable
- Soulever l'exception
- Gérer l'exception
Écrivons un code pour démontrer les étapes ci-dessus en détail.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Dans le bloc de déclaration ci-dessus, nous avons quatre variables, parmi lesquelles les trois premières sont des variables de type de données de nombre normal et la quatrième qui est ex_DivZero est la variable de type de données d'exception spéciale. La quatrième est notre exception définie par l'utilisateur.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
La partie d'exécution ci-dessus de ce bloc anonyme n'entrera en action que lorsque le diviseur est 0. Si le diviseur est zéro comme c'est le cas dans notre cas, l'erreur sera déclenchée et le contrôle du programme ignorera toutes les étapes suivantes et recherchera le gestionnaire d'exceptions correspondant. Dans le cas où il en trouverait un autre, il effectuera l'action en conséquence, sinon il terminera le programme ou nous signalera une erreur définie par le système non gérée.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
C'est le gestionnaire d'exceptions. Dès que l'utilisateur entre un diviseur égal à 0, la chaîne de message ci-dessus s'affiche.
Code final :
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
Passant à cet article sur la gestion des exceptions en PL/SQL, voyons comment utiliser la méthode PRAGMA_EXCEPTION_INIT.
Utilisation de la fonction PRAGMA EXCEPTION_INIT
Dans la fonction PRAGMA EXCEPTION_INIT, un nom d'exception est associé à un numéro d'erreur Oracle. Ce nom peut être utilisé dans la conception du gestionnaire d'exceptions pour l'erreur. Pour les grands projets avec de nombreuses erreurs définies par l'utilisateur, PRAGMA EXCEPTION_INIT est la méthode la plus utile et la plus appropriée.
Syntaxe :
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
Exemple
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
Le PRAGMA EXCEPTION_INIT indique au compilateur d'associer un nom d'exception à un numéro d'erreur Oracle, comme mentionné précédemment. Il vous permet de faire référence à n'importe quelle exception interne par son nom et d'écrire un gestionnaire spécifique pour celle-ci. Lorsque vous voyez une pile d'erreurs ou une séquence de messages d'erreur, celui du haut est celui qui peut être intercepté et traité.
Passant à cet article sur la gestion des exceptions en PL/SQL, laissez-nous comprendre comment utiliser la méthode RAISE_APPLICATION_ERROR.
Utilisation de la méthode RAISE_APPLICATION_ERROR
C'est une procédure intégrée au logiciel oracle. En utilisant cette procédure, nous pouvons associer un numéro d'erreur à un message d'erreur personnalisé. En combinant à la fois le numéro d'erreur et le message d'erreur personnalisé, une chaîne d'erreur peut être composée qui ressemble à ces chaînes d'erreur par défaut qui sont affichées par oracle lorsqu'une erreur est rencontrée. La procédure RAISE_APPLICATION_ERROR se trouve dans le package DBMS_STANDARD
Syntaxe
raise_application_error (error_number, message [, {TRUE | FALSE}]);
Exemple
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
Avec cela, nous arrivons à la fin de cet article sur "la gestion des exceptions en PL/SQL". J'espère que ce sujet est bien compris et vous a aidé. Essayez d'écrire vos propres codes et intégrez les méthodes expliquées dans cet article.
Si vous souhaitez vous former auprès de professionnels sur cette technologie, vous pouvez opter pour une formation structurée d'edureka ! Découvrez cette formation de certification MySQL DBA par Edureka, une entreprise d'apprentissage en ligne de confiance avec un réseau de plus de 250 000 apprenants satisfaits répartis dans le monde entier. Ce cours vous forme aux concepts de base et aux outils et techniques avancés pour gérer les données et administrer la base de données MySQL. Il comprend un apprentissage pratique sur des concepts tels que MySQL Workbench, MySQL Server, la modélisation de données, le connecteur MySQL, la conception de bases de données, la ligne de commande MySQL, les fonctions MySQL, etc. À la fin de la formation, vous pourrez créer et administrer votre propre base de données MySQL et gérer données.
Vous avez une question pour nous ? Veuillez le mentionner dans la section des commentaires de cet article "Gestion des exceptions en PL/SQL" et nous vous répondrons dans les plus brefs délais.