[go: up one dir, main page]

0% ont trouvé ce document utile (0 vote)
120 vues17 pages

CoursPLSQL Exception

Ce document présente les exceptions en PL/SQL, notamment les exceptions internes prédéfinies et non prédéfinies, ainsi que la gestion des exceptions.

Transféré par

Yosr Rannen
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 PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
120 vues17 pages

CoursPLSQL Exception

Ce document présente les exceptions en PL/SQL, notamment les exceptions internes prédéfinies et non prédéfinies, ainsi que la gestion des exceptions.

Transféré par

Yosr Rannen
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 PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 17

Cours

SGBD ~PL/SQL~
Enseignantes: LOULOU Sonia
CHAÂBANE Sameh

Mars 2022
ISET Sfax

Plan du cours
1. INTRODUCTION
2. LES STRUCTURES DE CONTRÔLE
3. LES CURSEURS
4. LES EXCEPTIONS
5. LES SOUS-PROGRAMMES
6. LES DECLENCHEURS
7. LES PACKAGES
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 2
Les Exceptions

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 3

Les Exceptions
 Une exception est une erreur survenue lors de l'exécution d'un bloc
PL/SQL.
 Deux types d’exceptions sont à distinguer:
 Exceptions internes :
 Caractérisées par des conditions d’erreurs connues par le serveur Oracle.
 Détectées et signalées implicitement.
 Libellées et codées ORA-ddddd (ou d est un digit).
 Deux types :
 Nommées (ou prédéfinies).
 Anonymes (ou non prédéfinies) : nommables par le développeur.
 Exceptions utilisateur
 Déclarées dans la section DECLARE.
 Levées explicitement par le développeur.
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 4
Les Exceptions
 Une exception, interne ou utilisateur, non traitée provoque l’échec du bloc
PL/SQL .
 Pour éviter cet échec, il est possible de gérer ces exceptions.
 La gestion d’une exception consiste à prévoir un traitement approprié qui
absorbe ou résout l’erreur. L’endroit de ce traitement est la section
EXCEPTION.
DECLARE
 En cas d’une exception rencontrée dans la BEGIN
section exécutable d’un bloc, le contrôle …
passe immédiatement à la section Erreur
EXCEPTION du même bloc pour chercher si …
EXCEPTION
un gestionnaire approprié ou générique
existe. END;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 5

Les Exceptions
 Gérer une exception revient à prévoir un DECLARE
traitement correspondant à l’erreur
BEGIN
rencontrée, afin de : …
Erreur
 Transformer un échec en succès. …
EXCEPTION
 Éviter la propagation de l’exception vers
les blocs parents. END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 6


Les Exceptions
BEGIN -- Section Exécution

EXCEPTION -- Section de gestion des exceptions
WHEN nom_exception1 [OR nom_exception11…] THEN
-- Traitement_exception1
WHEN nom_exception2 [OR nom_exception21…] THEN
-- Traitement_exception2
….
[WHEN OTHERS THEN --Toute exception non gérée
-- Traitement_exceptionGénérique ]
END;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 7

Les Exceptions internes nommées (Prédéfinies)


Nom Exception Code Oracle Situation
DUP_VAL_ON_INDEX ORA-00001 Lorsqu’une commande SQL tente de placer une valeur
dupliquée dans une colonne définie avec un index unique.
NO_DATA_FOUND ORA-01403 Lorsqu’un curseur implicite d’interrogation n’identifie aucun
n-uplet.
TOO_MANY_ROWS ORA-01422 Lorsqu’un curseur implicite d’interrogation identifie plus quun
n-uplet à retourner.
ZERO_DIVIDE ORA-01476 Provoquée par une tentative de division par zéro.
CURSOR_ALREADY_OPEN ORA-06511 Provoquée par une tentative d’ouverture d’un curseur déjà
ouvert.
INVALID_CURSOR ORA-01001 Lorsqu’un curseur fermé est référencé dans une opération de
lecture (FETCH), de fermeture (CLOSE) ou via un de ses
attributs (%FOUND, %ROWCOUNT, …).

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 8


Les Exceptions internes nommées (Prédéfinies)
Nom Exception Code Oracle Situation
VALUE_ERROR ORA-06502 En cas de troncature (Exp : chaîne trop longue) ou d’erreur de
conversion.
INVALID_NUMBER ORA-01722 Lorsqu’une commande SQL spécifie un nombre invalide (Exp : une
chaîne représentant un nombre invalide c'est-à-dire ne pouvant
pas être convertie en une valeur numérique).
LOGIN_DENIED ORA-01017 La connexion à la base a échoué car le nom d’utilisateur ou le mot
de passe est invalide.
… … …

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 9

Les Exceptions internes nommées (Prédéfinies)


DECLARE
V_NomMam Maman.NomJeuneFille%type;
BEGIN
Select NomJeuneFille into V_NomMam From Maman Where CinMam= '11111111';
DBMS_OUTPUT.PUT_LINE('Nom Maman : '|| V_NomMam);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Mamam inexistante !!!');
END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 10


Les Exceptions internes nommées (Prédéfinies)
DECLARE
V_CinM Maman.CinMam%type;
BEGIN
Select CinMam into V_CinM From Maman Where Upper(NomJeuneFille)='TOUNSI'
And Upper(PrenMam)='ALIA';
DBMS_OUTPUT.PUT_LINE ('CIN Maman ALIA TOUNSI : '||V_CinMama);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Plusieurs Mamans possèdent ce Nom & Prénom');
END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 11

Les Exceptions internes anonymes : non prédéfinies


 Une exception interne non prédéfinie peut être piégée par la clause
générique WHEN OTHERS.
 Pour connaître le code et le message d’une exception interne, on peut
utiliser les fonctions SQLCODE et SQLERRM.
 SQLCODE : Renvoie un entier représentant le n° de l’erreur interne qui
a provoqué l’exception. Si pas d’erreur cet entier vaut zéro.
 SQLERRM : Renvoie un texte représentant le message d’erreur complet
associé à l’exception rencontrée. Ce message est de la forme :
ORA-dddddd : texte explicatif

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 12


Les Exceptions internes anonymes : non prédéfinies
 Lors de l'insertion d’une ligne sans valeur de clé primaire, Oracle
déclenche l’erreur -1400 : violation de la contrainte not null.
BEGIN
Insert into Enfant (PrenEnf) Values ('Mohamed Ali');
EXCEPTION
When Others Then
DBMS_OUTPUT.PUT_LINE(SQLCODE ||'***'||SQLERRM);
END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 13

Les Exceptions internes anonymes : non prédéfinies


Code SQL Code Oracle Description
-0001 ORA-00001 Violation de contrainte unique
-0025 ORA-00025 Échec de l’allocation de la chaîne (pas de mémoire disponible)
-0041 ORA-00041 Session terminée - Temps limite actif dépassé
-0911 ORA-00911 Caractère non valide
-0912 ORA-00912 Paramètre d'entrée trop long
-1400 ORA-01400 Violation de contrainte Not Null
-0960 ORA-00960 Définition de colonnes ambiguës dans l’ordre Select
-2290 ORA-02290 Violation de contrainte check
-2291 ORA-02291 Violation de contrainte d’intégrité - Clé parent introuvable
-2292 ORA-02292 Violation de contrainte d’intégrité - Clé parent référencée dans un
enregistrement fils
… …
Sonia LOULOU & Sameh CHAÂBANE
… 27/03/2022 14
Les Exceptions internes anonymes : non prédéfinies
 PL/SQL offre au développeur la possibilité de nommer des erreurs
internes non prédéfinies ce qui permettra de les distinguer et de les
gérer comme les exceptions prédéfinies.
Il suffit donc de :
 Déclarer l’exception.
 L’associer au code de l’erreur appropriée, en utilisant : Pragma
Exception_init .
 Ajouter le gestionnaire d’exception correspondant.

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 15

Les Exceptions internes anonymes : non prédéfinies


Déclaration de l'exception
Declare
Nom_exc Exception;
Pragma Exception_init (Nom_exc, code_err_interne);

Begin
SQLCODE
... Associer l’exception déclarée à
un code d'erreur interne
Exception
When Nom_exc Then
-- Traitement_Exception
End;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 16
Les Exceptions internes anonymes : non prédéfinies

DECLARE
E_Clé_nonRenseignée Exception;
Pragma Exception_init (E_Clé_nonRenseignée , -1400);
BEGIN
Insert into Enfant (PrenEnf) Values ('Mohamed Ali');
EXCEPTION
When E_Clé_nonRenseignée Then
DBMS_OUTPUT.PUT_LINE('La valeur de la clé est non renseignée');
END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 17

Les Exceptions internes anonymes : non prédéfinies


 Lors de la suppression d’une ligne référencée par une clé étrangère,
Oracle déclenche l’erreur -2292.
Declare
SupCleRef Exception;
Pragma Exception_init (SupCleRef, -2292);
Begin
Delete From Maman Where CinMam='05020203';
Exception
When SupCleRef Then
DBMS_OutPut.Put_Line ('Tentative de suppression d"une ligne référencée
par une clé étrangère');
End;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 18
Les Exceptions internes

 Les exceptions internes (prédéfinies et non prédéfinies) sont


provoquées implicitement. Cependant, elles peuvent être
provoquées explicitement, si nécessaire, par :
RAISE nom_Exception ;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 19

Les Exceptions Utilisateur


 En plus des exceptions internes, le programmeur peut créer ses propres
exceptions et les gérer.
 Les exceptions définies par l'utilisateur doivent être déclenchées
explicitement en utilisant le mot-clé RAISE.
DECLARE
Nom_Exception_Ut Exception;
BEGIN
EXCEPTION

WHEN Nom_Exception_Ut THEN
If Condition Then
-- Traitement_Exception_Ut
RAISE Nom_Exception_Ut ;
….
End If;
END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 20
Les Exceptions : Application
 Ecrire un programme PL/SQL permettant d’ajouter un nouvel enfant à la
maman 'Amal Soussi'. Ce programme doit permettre la saisie des données
de l’enfant et de gérer les exceptions appropriées dans les cas suivants :

 Plusieurs mamans possèdent le nom 'Amal Soussi'


 Aucune maman n’a ce nom
 La contrainte check sur le poids de l’enfant est violée (PoidsNaiss > 0)
 La taille saisie de l’enfant est <= 0
 La non nullité du nom et prénom de l’enfant est violée

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 21

Les Exceptions : Application


Solution 1 : Declare
R_enfant Enfant%RowType;
ExUt_Taille Exception; --Exception utilisateur
Begin
Select CinMam into R_enfant.CinMam from Maman
Where upper(NomJeuneFille)='SOUSSI' and upper(PrenMam)='AMAL';
Select Count(*) into R_enfant.NumEnf From Enfant
Where CinMam=R_enfant.CinMam;
--Saisie NomPrénom
R_enfant.NomEnf:='&NomEnf';
R_enfant.PrenEnf:='&PrenEnf';
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 22
Les Exceptions : Application
--Saisie Poids
R_enfant.PoidsNaiss:='&PoidsNaiss';
--Saisie taille enfant
R_enfant.TAILLENAISS:='&TAILLENAISS';

if R_enfant.TAILLENAISS<=0 Then
Raise ExUt_Taille;
End if;

R_enfant.NumEnf:= R_enfant.NumEnf+1;
R_enfant.DateNaissEnf:=Sysdate;
insert into Enfant Values R_enfant;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 23

Les Exceptions : Application


Exception
WHEN TOO_MANY_ROWS THEN --Exception interne prédéfinie
dbms_output.put_line ('Plusieurs Mamans portent ce Nom');
WHEN NO_DATA_FOUND THEN --Exception interne prédéfinie
dbms_output.put_line('Pas de maman ayant ce Nom');
WHEN ExUt_Taille THEN --Exception utilisateur
dbms_output.put_line('vérifiez vos données : taille doit être > 0 …');
WHEN Others then --Exceptions internes anonymes
dbms_output.put_line('vérifiez vos données : Nom, Prénom et poids …');
END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 24


Les Exceptions : Application
Solution 2: Declare
E_Poids Exception;
ExUt_Taille Exception; --Exception utilisateur
E_NomPren Exception;
Pragma Exception_init (E_Poids, -02290);
Pragma Exception_init (E_NomPren, -01400);
R_enfant Enfant%RowType;
Begin
Select CinMam into R_enfant.CinMam from Maman
Where upper(NomJeuneFille)='SOUSSI' and upper(PrenMam)='AMAL';
Select Count(*) into R_enfant.NumEnf From Enfant
Where CinMam=R_enfant.CinMam;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 25

Les Exceptions : Application


--Saisie NomPrénom
R_enfant.NomEnf:='&NomEnf';
R_enfant.PrenEnf:='&PrenEnf';

--Saisie Poids
R_enfant.PoidsNaiss:='&PoidsNaiss';

--Saisie taille enfant


R_enfant.TAILLENAISS:='&TAILLENAISS';
if R_enfant.TAILLENAISS<=0 Then
Raise ExUt_Taille;
End if;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 26
Les Exceptions : Application
Exception
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line ('Plusieurs Mamans portent ce Nom');
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Pas de maman ayant ce Nom');
WHEN E_Poids THEN
dbms_output.put_line('Vérifiez vos données : Poids doit être > 0');
WHEN ExUt_Taille THEN
dbms_output.put_line('Vérifiez vos données : taille doit être > 0');
WHEN E_NomPren THEN
dbms_output.put_line('Nom et prénom doivent être non nulls');
--WHEN Value_Error THEN
--dbms_output.put_line('Taille et poids doivent être numériques');
END;
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 27

Propagation des Exceptions


 Lorsqu’un sous-bloc traite une exception, il se termine normalement (succès)
et l’enchaînement reprend dans le bloc parent immédiatement après
l’instruction END du sous-bloc.
 Si PL/SQL rencontre une exception pour laquelle le bloc courant n’a pas prévu
un gestionnaire, l’exception se propage c-à-d qu’elle se reproduit dans les
blocs parents successifs jusqu’à ce qu’un gestionnaire d’exception la capture.
 Ce principe de propagation s’applique à toute sorte d’exceptions (internes et
utilisateurs).
 Si aucun des blocs ne traite l’exception alors elle se transmet à
l’environnement hôte.
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 28
Propagation des Exceptions
DECLARE
-- déclaration
BEGIN

DECLARE
Exception X;
BEGIN

Raise X; Instructions outre passées

EXCEPTION
Aucun gestionnaire existant pour capturer l’exception X
END;

Instructions outre passées
EXCEPTION
… Exécution du gestionnaire de X s’il existe, sinon erreur dans
END; l’environnement hôte
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 29

Propagation des Exceptions : Sections


Declare et Exception
 Toute exception levée (produite) dans la section DECLARE ou
EXCEPTION se propage et ne peut être traitée dans son bloc, même
s’il existe un gestionnaire d’exception approprié ou générique
(OTHERS) qui la traite.
 Cependant, cette exception peut être traitée dans le bloc parent s’il
existe un gestionnaire d’exception approprié ou générique (OTHERS)
qui la traite.

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 30


Propagation des Exceptions : Section Declare
DECLARE

BEGIN

DECLARE
V_NO NUMBER(3) :=‘ABC’; Affectation illégale provoquant l’exception
BEGIN VALUE_ERROR

EXCEPTION Ne peut être exécutée pour l’exception
When OTHERS THEN
… VALUE_ERROR
END;

… Bloc en échec, Exception VALUE_ERROR


EXCEPTION reconduite

END; Exécution du gestionnaire de
Sonia LOULOU & Sameh CHAÂBANE VALUE_ERROR s’ il existe 27/03/2022 31

Gestion locale et reproduction d’une EXCEPTION


 Parfois on a besoin de traiter localement une exception levée , puis de la
transmettre au bloc parent.
 La commande « Raise; » permet cette reproduction.

EXCEPTION
WHEN Nom_exeption THEN
-- Gérer localement l’exception
RAISE; --Reproduit l’exception courante

END;

Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 32
Envoi de message d’erreur :
Raise_Application_Error
 RAISE_APPLICATION_ERROR :
 Est une procédure du package DBMS_STANDARD.
 Utile pour produire des messages d’erreur applicatifs spécifiques à
l’environnement appelant (SQL*Plus, S/P Pl/SQL, …).
 Utilisée pour reproduire l’erreur et annule la transaction en cours.
 Utilisable dans la section Exécutable et Exception.
Raise_Application_Error (numéro_erreur, message);
 numero_erreur : Entier entre -20001 et -20999
 message : texte de longueur maximum 512 caractères.
Sonia LOULOU & Sameh CHAÂBANE 27/03/2022 33

Vous aimerez peut-être aussi