0% ont trouvé ce document utile (0 vote)
14 vues12 pages

Gestion des exceptions en PL/SQL

Ce document décrit les exceptions en PL/SQL, notamment les exceptions internes prédéfinies par Oracle ainsi que les exceptions définies par l'utilisateur. Il présente également la procédure RAISE_APPLICATION_ERROR permettant de lever des exceptions personnalisées.

Transféré par

Ahmed Haddad
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
14 vues12 pages

Gestion des exceptions en PL/SQL

Ce document décrit les exceptions en PL/SQL, notamment les exceptions internes prédéfinies par Oracle ainsi que les exceptions définies par l'utilisateur. Il présente également la procédure RAISE_APPLICATION_ERROR permettant de lever des exceptions personnalisées.

Transféré par

Ahmed Haddad
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd

Ministère de l’Enseignement Supérieur et de recherche scientifique

Université de Sousse

Séance de Cours

Chapitre7 :
Les exceptions

2022-2023
I. Introduction
 Afin d’éviter qu’un programme s’arrête à la première erreur il est indispensable de
prévoir tous les cas potentiels d’erreurs et d’associer à chacun de ces cas la
programmation d’une exception PL/SQL.

 Dans un bloc PL/SQL, la section EXCEPTION permet de traiter les erreurs survenues
lors de l’exécution du bloc PL/SQL. Il existe deux grandes familles d’erreurs :

 les erreurs prédéfinies


 les erreurs définies et traitées par l’utilisateur

II. Exception interne prédéfinie

 Sont celles qui se produisent le plus souvent.


 Oracle affecte un nom de manière à les traiter plus facilement dans le bloc EXCEPTION.
 Le tableau suivant les décrit quelques exceptions prédéfinies

2
II. Exception interne prédéfinie
Nom de l’exception Numéro Commentaires
ACCESS_INTO_NULL ORA-06530 Affectation d’une valeur à un objet non
initialisé.
CASE_NOT_FOUND ORA-06592 Aucun des choix de la structure CASE sans
ELSE n’est effectué
COLLECTION_IS_NULL ORA-06531 Utilisation d’une méthode autre que EXISTS sur
une collection (nested table ou varray) non
initialisée.
CURSOR_ALREADY_OPEN ORA-06511 Ouverture d’un curseur déjà ouvert.
DUP_VAL_ON_INDEX ORA-00001 Insertion d’une ligne en doublon (clé primaire).
INVALID_CURSOR ORA-01001 Ouverture interdite sur un curseur.
INVALID_NUMBER ORA-01722 Échec d’une conversion d’une chaîne de
caractères en NUMBER.
LOGIN_DENIED ORA-01017 Connexion incorrecte.
NO_DATA_FOUND ORA-01403 Requête ne retournant aucun résultat.
NOT_LOGGED_ON ORA-01012 Connexion inexistante.
PROGRAM_ERROR ORA-06501 Problème PL/SQL interne (invitation au contact
du support…)
3
II. Exception interne prédéfinie
Nom de l’exception Numéro Commentaires
ROWTYPE_MISMATCH ORA-06504 Incompatibilité de types entre une variable
externe et une variable PL/SQL.
SELF_IS_NULL (extension objet). ORA-30625 Appel d’une méthode d’un type sur un objet
NULL
STORAGE_ERROR ORA-06500 Dépassement de capacité mémoire.
SUBSCRIPT_BEYOND_COUNT ORA-06533 Référence à un indice incorrect d’une
collection (nested table ou varray) ou
variables de type TABLE

SYS_INVALID_ROWID ORA-01410 Échec d’une conversion d’une chaîne de


caractères en ROWID.
TIMEOUT_ON_RESOURCE ORA-00051. Dépassement du délai alloué à une ressource
TOO_MANY_ROWS ORA-01422 Requête retournant plusieurs lignes.
VALUE_ERROR ORA-06502 Erreur arithmétique (conversion, troncature,
taille) d’un NUMBER.
ZERO_DIVIDE ORA-01476 Division par zéro.
Tableau 1 : Exceptions prédéfinies 4
II. Exception interne prédéfinie
II.1 Traitement d’une exception interne prédéfinie
Le Traitement d’une exception interne prédéfinie se fait au niveau de la section
EXCEPTION. La syntaxe à utiliser est la suivante :
DECLARE
….
BEGIN

EXCEPTION
WHEN ZERO_DIVIDE THEN
(traitement de l’erreur);
WHEN NO_DATA_FOUND THEN
(traitement de l’erreur);
……
WHEN OTHERS THEN
v_code_erreur := SQLCODE;
v_message_erreur := SQLERRM;
INSERT INTO table_debug VALUES(sysdate, v_code_erreur, v_message_erreur) ;
COMMIT
END;
5
II. Exception interne prédéfinie
II.1 Traitement d’une exception interne prédéfinie
Exemple
Le tableau suivant décrit une procédure qui gère deux erreurs :
 aucun employé ayant le nom de 'SCOTT' n'existe dans la table EMP
(NO_DATA_FOUND).

 et plusieurs employés ayant le nom de 'SCOTT' existent dans la table


EMP(TOO_ MANY_ROWS).

Le programme se termine correctement si la requête retourne une seule ligne

6
Code PL/SQL Commentaries
DECLARE
Requête déclenchant
v_empno [Link] %TYPE ;
potentiellement deux
v_job [Link]%TYPE ;
exceptions prévues
BEGIN
SELECT empno, job INTO v_empno , v_job FROM EMP
WHERE ename = 'SCOTT';
dbms_output.put_line(' le numéro et la fonction de l’employé sont '
| |v_empno | |' ' | | v_job );

EXCEPTION Aucun résultat renvoyé


WHEN NO_DATA_FOUND THEN
dbms_output.put_line(' Il n’existe pas un employé ayant ce nom);

WHEN TOO_MANY_ROWS THEN Plusieurs résultats


dbms_output.put_line(' Il y a plusieurs employés ayant ce nom); renvoyés
END;
7
II. Exception interne prédéfinie
II.1 Traitement d’une exception interne prédéfinie
Remarque :
 Si le programme prend en compte l’erreur dans une entrée WHEN…, les instructions
de cette entrée sont exécutées et le programme se termine.
 Si l’exception n’est pas prise en compte dans le bloc EXCEPTION :
il existe une section OTHERS où des instructions s’exécutent ;

S'il n’existe pas une section OTHERS et l’exception sera propagée au programme
appelant (une section traite de la propagation des exceptions).
Pour les erreurs Oracle prédéfinies, il est toujours préférable d’utiliser l’instruction
WHEN OTHERS dans le traitement des blocs PL/SQL. Cela vous permet de
conserver une trace de l’erreur rencontrée.

"SQLCODE : Code de la dernière exception levée


"SQLERRM : Message d’erreur associé
8
III. Exception définie par l’utilisateur
Il est possible de définir ses propres exceptions. La syntaxe à utiliser est la suivante :

DECLARE
...
Nom_erreur EXCEPTION ;
...
BEGIN
...
IF (problème rencontré) THEN RAISE Nom_erreur ;
...
EXCEPTION
WHEN Nom_erreur THEN
(traitement de l’erreur);
END;

Une exception utilisateur ne sera pas levée de la même manière qu’une exception
interne.
 Le programme doit explicitement dérouter le traitement vers le bloc des exceptions
9
par la directive RAISE.
III. Exception définie par l’utilisateur
Exemple :

Soit la table PRODUIT (numprod, desprod, prixuni, …).


On souhaite calculer le prixttc de chaque produit et l’insérer dans une table
PRODUIT_TTC(numprod, prixttc).
Pour réaliser cette opération, il faut que la table PRODUIT soit renseignée.

10
DECLARE
nbp NUMBER(3);
Aucun_Produit EXCEPTION; --Déclaration de l’exception
CURSOR calcul IS SELECT numprod, prixuni*1.206 prixttc FROM produit;
tuple calcul%ROWTYPE;

BEGIN
SELECT COUNT(*) INTO nbp FROM PRODUIT;-- Comptage des produits
IF nbp = 0 THEN RAISE Aucun_Produit; -- Test « il existe des produits » ou pas ?
END IF;
FOR tuple IN calcul LOOP -- Recopie des valeurs dans la table prodttc
INSERT INTO prodttc VALUES ([Link], [Link]);
END LOOP;
COMMIT; -- Validation de la transaction
EXCEPTION
WHEN Aucun_Produit THEN -- Gestion de l’exception
dbms_output.put_line('Erreur : table vide');
WHEN OTHERS THEN-- Gestion des autres exceptions
dbms_output.put_line('Erreur inconnue');
END;
11
IV. Procédure RAISE_APPLICATION ERROR
 Permet de définir ses propres messages et codes d’erreurs.
Syntaxe :
RAISE_APPLICATION_ERROR(numéroErreur, message [, {TRUE | FALSE}]);
 numéroErreur : valeur définie par l'utilisateur pour l'exception, comprise dans
[–20 000,–20 999]
message : chaîne de caractères (max 2 048 octets) décrivant l’erreur.
TRUE | FALSE : booléen facultatif.
TRUE pour positionne l’erreur dans une pile si plusieurs exceptions doivent
être propagées en cascade.,
FALSE par défaut remplace toutes les erreurs précédentes dans la pile.

La procédure RAISE_APPLICATION_ERROR peut être utilisée dans le code ou dans


la section de traitement des exceptions .d’un programme PL/SQL.

L’appel à la procédure RAISE_APPLICATION_ERROR interrompe le programme et


retourne le numéro et le message d’erreur qui peuvent être récupérés par l’environnement
englobant (variables SQLCODE et SQLERRM).
12

Vous aimerez peut-être aussi