Database
 sql >> Base de données >  >> RDS >> Database

Apprenez à gérer les exceptions en PL/SQL

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

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&nbsp; 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.