You are on page 1of 6

Faculté des sciences

Dépa rtement d' I nformatique


- :iffiy*L ùrl**
#'rlix*aya Année universitaire : 202U2022

lll-PL/SQL : Les Exceptions

t. Contexte

Afin d'éviter qu'un programme s'arrête à la première erreur (requête ne retournant aucune ligne,
valeur incorrecte à écrire dans la base, conflit de clés primaires, division par zéro, etc.), ll
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. Ce mécanisme des exceptions est implémenté
dans la plupart
des langages récents, notamment orientés objet,
Cette façon de programmer a quelques avantages :
I obliger les programmeurs à traiter les erreurs : La plupart des compilateurs des langages à
exceptions (notamment java) ne compilent que si pour chaque erreur potentielle, vous avez
préparé un bloc de code (éventuellement vide...) pour la traiter. Le but est de vous
assurer que
vous n'avez pas oublié d'erreur.
I Rattraper les erreurs en cours d'exécution : Certaines erreurs d'exécution sont rattrapables,
autrement dit, il est possible de résoudre le problème sans interrompre le programme.
' Ecrire le traitement des erreurs à part : Pour des raisons fiabilité et de lisibiiité, les
erreurs
sont traitées à part dans les langages à exception.

a. Définition : Une exception PL/SQL correspond à une condition d'erreur et est associée
à un
identificateur. Une exception est détectée (aussi dite < levée >) au cours de l,exécution
d,une
partie de programme (entre un BEGIN et un END). Une fois levée, l'exception
termine le corps
principal des instructions et renvoie au bloc EXCEPTION du programme en question
selon la
structure suivante :

DECLARE
/* Décloration des voriables */
BEGIN
/*lnstructions ù exécuter */
EXCEPTION
/*Troitement des erreurs */
END;
si aucune erreur ne se produit, le bloc est ignoré et le traitement se termine (ou retourne à
son
appelant s'ils'agit d'un sous-programme), La syntaxe générale d'un bloc d'exceptions
est la suivante :

EXCEPTION
WHEN exceptionT IOR exception2 ,,.]THEN instructions;
IWHEN exception3 [OR exception4 ...]THEN instructions;l
IWHEN OTHERS THEN instructions;]
ll est possible de grouper plusieurs exceptions pour programmer le même traitement, La dernière
entrée (OTHERS) doit être éventuellement toujours placée en fin du bloc d'erreurs.

b' Principe de fonctionnement.: L'exemple suivant illustre deux mécanismes déclenchant


une
exception sous Oracle :

(exempledu SELECT qui retourne aucune ligne, ce qui déclenche l'exception


NO_DATA_FOUND).

RAISE) son programme dans le bloc des exceptions sous certaines conditions,
L'exception
est ici manuellement déclenchée et peut appartenir à l'utilisateur
(CANDIDAT-TROP-JEUNE) ou être prédéfinie au niveau d'Oracle (par exempte :
zERO_DtVtDE).

22 BDll- Pr. M,E.H CHARAF


rf
è
Faculté des sciences \
Département d' I nformatique
&,t *w, Année tJniversitaire : 202112022

DECLARE
/* Déclarotion des variables */
BEGIN

tF (...) THEN RAISE CANDTDAT_NON_JEIJNE;

EXCEPTION
W H EN N O-DATA-F O U N D TH E N
BLOC Instructions -A
WHEN ZERO DIVIDETHEN
BLOC lnstructions -B
W H E N CAN D I DAT-TRO P.I E TI N E TH EN
BLOC Instructions -C
WHEN OTHERSTHEN
BLOC lnstructions -D
END;

c. SQLCODE vs. SQLERRM

Une exception est une "erreur type", elle porte éventuellement un nom
au même titre qu,une variable
a un identificateur (exemple : MyExcep), un code et un message.

Lorsque dans les instructions, l'erreur MyExcep se produit, le code du BEGIN


s,interrompt et le code
de la section EXCEPTTON est lancé, Exemple:

DECLARE
BEGIN
/'*instuctions */
COMMIT;
EXCEPTION
WHEN MyExcep THEN ROLLBACK;
D BMS*OUTPUT. p UT_LI N E (, MyExcep exce ptio n raised
!' ) ;
WHEN OTHERSTHEN
DBMS_OUTPUT.PUT_L|NE ('SILCODE =,
| | SeLCODE);
DBMS_OUTPUT.PUT_LINE ('S}LERRM ='
| | SeLERRM);
END;

2. Les Exceptions prédéfinies

Les exceptions prédéfinies sont celles qui se produisent le plus


souvent. oracle affecte un nom de
manière à les traiter plus facilement dans le bloc EXCEPTTON. Le code
d,erreur (SeLCODE) qui peut
être récupéré par un programme d'application est inclus dans le numéro
interne de l,erreur (pour
f'exception ( zERo-DtvlDE >, il s'agit de -t4761. Le tableau suivant les décrit :

23 BDll- Pr, M.E.H CHARAF


s
Faculté des sciences
Département d'l nformatique
h,;o Année u niversitai re : 2021 / 2022

:,|{orn li ::::t;

ACCESS rr{Yt l{$LI, 0RÂ-t653t Affeetation d'une valeur i* un cbjet nan initiatrisê-
CÀSE-N*T-FTLTND oRÂ-06 592 Aucun des choix de la struciilrÊ cÂgE sâns ELsE
n'est eftctué.
coLLE ,i 3 ï tld*r s_NLrr.L 0RÂ-û6533 Utilisatien d'une mÉthode autre gr;e Eïrgts sur
ume collecti*n {nested faf:fe ou uarmy} nalr
initialisée-
CLTEST.IP- ALREÀ.BY ÛPE3'I sRÂ-'36 5 t L ûulerture d'un curseur dÉià ouvert
Dup vÂL tt{ r}{BElt *R.S-*çS$I lnsertion d'une ligne en douhlçn {cl* prirnaire}
ïltltA.tIB CISRSSR. ûRà-&Lû83_ ûuverture inûerdite sur un curseur.
il{L'ÀLXË_Nï$dEgR rRA-tL?r3 Ëchec d'une conversion d'une chaine de
caractères en p&[!tBER "

tilËft{_sE$cED sRÂ-s]"st? t*nnexion incorrecte.


NO_DÀTA-FOTJ!{D çRÂ-flt-4Êf, Requele n* retûurnani aucun résuftat

M*i:.I3_tY* _ ôRJt-St-S1"3 Cannexicn Inexistante.


FP.CçR.AM ERRSR. oRA-065St Pr.oblème PL/SQL interne {inrritatic* au contact du
support...).
R,OI{.TYPF-f.TJ SMÀTf;I{ ûEA-0,65S{ Incornpatibilité de Types entre une variable externe
et u,ne variabfe PU GL.
SELF-Is-}TLTLL *Fs^-3û6?5 Appef d'une mêthçde d'un gpe sur un ûbjet l{rïr,L
{extension objet}.
STOÈ4GE ERRI]R" cF,Â-*6sË0 Dépassementde câpâcité rnè,moire"
SÏJBSCR,IFT EEYG$TS Cë{JST tR"&- û,6 53 3 Ré{érence & çn indice inconeÊt d'une coflectlo:n
STTBSC,R.ÏFT_*UTSITE-LX&T3T ORA-0683; , {nesfed fable ou raray} su variables de rype
TÂELE.

sYS NEdJILIB ROWID *BÂ-ûl4l0 Echec d'unre conversion d'une chaine de


caractÈres en R*!frD-
T r3{80ËT_t}I_nEStURCE SRId- 0ûDE L DÉpassement du délai alloué à une ressource

T0-ttYY.+:y: 0RÀ-01422 Requëte reteurnant plusieure lignes.


\IAT"UE ER.F.ÛR, $RÀ-E$5t2 Eneur arithnrêtique {ccnversion. troncature, taille}
d"un lrmrteER-
ZERS DItr'TDE oRA-sl-4T,6 Division par zÉro-

a. Les Exceptions prédéfinies : (Plusieurs erreurs même instruction)

CREATE OR REPLACE PROCEDURE Plus_Err_M_inst (Code NUMBER) tS


VoT VARCHAR2;
BEGIN
SELECT nom INTO Var FROM Candidat Requête déclenchant deux exceptions prévues
Where num_Comp=Çsf,s;
DBMS OUTPUT. PUT LINE ùq.nt /e code : 'l lCode | | 'est' | | var) ;
EXCEPTION
W H E N N O-DATA-FO U N D TH EN
DBMS_OUTPUT. PUT_LINE ('La compognie dont Ie code Code 'n" a eucun candidat') ;
WHENTOO-MANY-ROWSTHEN **
DBMS-OUTPUT, PUT-LINE ('Lo compognie dont le code est:'l lCode | | ' a plusieurs condidats') ;
24 BDll - Pr, M.E,H CHARAF
d
à
Faculté des sciences
Département d' I nformatique
h*wu Année universitaire : 202112022

L'exemple précédent décrit une procédure qui gère deux erreurs : aucun candidat n'est associé à la
compagnie de code passé en paramètre (NO_DATA_FOUND) et plusieurs candidats le sont
(TOO-MANY_ROWS).

b. Les Exceptions prédéfinies : (Même erreur Plusieurs instructions)

L'exemple qui suit décrit un autre cas de figure pour la gestion deux fois l'exception (NO_DATA_
FOUND) sur deux requêtes distinctes.
.1. La requête : < 1 > extrait le nom du candidat ayant le code passé en paramètre.
* La requête : < 2 > extrait le nom du candidat ayant le nombre de publications en paramètre,
.1. La directive OTHERS permet d'afficher en clair une autre erreur déclenchée par une des deux
requêtes (notamment TOO_MANY_ROWS) avec l'utilisation des deux variables d'Oracle :
SQLERRM qui contient le message en clair de l'erreur et SQLCODE le code associé.

.3 Exemple:

CREATE OR REPLACE PROCEDURE Plus_inst_M-Err ( Code NUMBER, N_pub NUMBER) IS


VoT VARCHAR2;
Requete NUMBER:=7;
Requêtes (1 et 2) déclenchant une exception

SELECT nom INTO Vor FROM Condidat...,.*


Where num_Emp=Ç6fls;
DBMS_OUTPUT.PUT_LINE ('Le candidat ayant le code : l l 'est'l l var) ;

SELECT nom INTO Vor FROM Candidot....-*_..


Where pub=N_pub;
DBMS_OUTPUT.PUT_LINE ('Le condidot oyont : 'publications est'l I

EXCEPTION
WHEN NO DATA FOUNDTHEN
IF Requete= 7 THEN
DBMS_OUTPUT. PUT_LINE ('Pas de condidat ayant le code : 'l I Code) ;
ELSE
DBMS_OUTPUT. PUT_LINE ('Pos de condidat qyont un nombre de publicotion : 'l I N_pub) ;
END IF;
Autres Erreurs
WHEN OTHERSTHEN
DBMS-OUTPUT, PUT_ LINE ('Erreur Oracle:'llSQLERRMll '(ll SQLCODE | | ')');
END;

r Dans cette procédure, une erreur sur la première requête fait sortir le programme (après avoir
traité l'exception) et de ce fait la deuxième requête n'est pas évaluée.
r Pour cela, il est intéressant d'utiliser des blocs imbriqués pour poursuivre le traitement après avoir
traité une ou plusieurs exceptions,

c. lmbrication de blocs d'erreurs

L'exemple suivant décrit un bloc interne qui inclut un bloc d'exceptions imbriqué au code
principal(externe). Ce mécanisme permet de poursuivre l'exécution après qu'Oracle a levé une
exception. Dans cette procédure, les deux requêtes sont évaluées indépendamment du résultat
retourné par chacune d'elles.

25 BDll- Pr. M.E.H CHARAF


fa
è
è
Faculté des sciences
Dépa rtement d'l qformatique Année niversita ire : 202I/ 2022
*,1,;"r;; u

/*bloc externe*/
CREATE PROCEDURE Excep_lmbriq ( Code NUMBER, N_pub NUMBER) lS
VaT VARCHAR2 ;
/*lnstructions exécutables de bloc externe*/
BEGIN
| /*bloc interne*/
i aeclv Bloc imbriqué
SELECTnom INTO Var FROM
Where num-Emp=Çsf,s;
DBMS_OUTPUT. PUT_LIN E ('Le ca ndid at Code 'est'
EXCEPTION
WH EN NO-DATA-FOUND THEN
DBMS_OUTPUT. PUT_LINE ('Pos de candidat oyant le code : 'l I
WHEN OTHERSTHEN
,tt
i DBMS_OUTPUT. PUT_LINE ('ErreurOrocle:'l\SQLERRMll'(IISQLCODE ll')'); i
1". _eryoi" _"._ * _- __ _ *- . . *_ I
I
It

t
l

1*,struffiï:i';f|îi,::i";;î;"{oln1,oo,..,, @
Suite de traitement
i
Where pub=N-pub, \ i
DBMS-OUTPUT.PUT-LINE ('Le condidat ayàyt : 'l lN-publ I 'publicotions est'l I var); i
EXCEPTTON I

externe*/ Gçstion des exceptions de la deuxièqe.requête


/*Gestionnaires d'exceptions de btoc ) I i
WHEN NO-DATA-FOUNDTHEN */ I

DBMS_OUTPUT. PIJT_LINE ('Pas de candidot oyont un nombre de publication : 'l I N_pub) ; I

WHEN OTHERSTHEN i

DBMS-OUTPUT. PUT-LINE ('Erreur Oracle: 'l ISQLERRM I I '( I I SQLCODE | | ')'); I

END; I

Dans le cas de blocs PL/SQL imbriqués, si I'exception est déclenchée dans un bloc interne, le contrôle
du programme descend vers la section d'exception du bloc interne.

Si le bloç interne sère I'exception. il est exécuté et le contrôle du programme retourne à I'instruction
exécutable suivante dans le bloc externe.

Si le bloc interne ne gère pas I'exception, le contrôle de programme continue de chercher le


gestionnaire approprié et se propage à la section d'exception du bloc externe.

Attention ; L'exécution du bloc externe est ignorée et le contrôle du programme orrive directement
dans la section d'exception. Le contrôle de programme continuera à propager I'exception non gérée
dans les blocs externes jusqu'à ce que celle appropriée soit trouvée et gérée.

3, Les Exceptions utilisateurs

ll est possible de définir ses propres exceptions : Cela permet de bénéficier des blocs de traitements
d'erreurs et aborder une erreur applicative comme une erreur renvoyée par la base. L'objectif est donc
d'améliorer et faciliter la maintenance et l'évolution des programmes.

selon la syntaxe: nomException EXCEPTION;

. Une exception utilisateur ne sera pas levée de la même manière qu'une exception interne.
r Le programme doit explicitement dérouter le traitement vers le bloc des exceptions par la
directive RAISE.
. L'instruction RAISE permet éealement de déclencher des exceptions prédéfinies.

26 BDll - Pr. M.E,H CHARAF


d
è
Faculté des sciences \
Dépa rtement d' I nformatique
W,I l,;w Année universitaire : 202112022

r Erreur_candidatTropJeune quiva interdire l'insertion des candidats ayant moins de 18 ans;


r Erreur_candidatNonExperimente quiva interdire l'insertion des candidats ayant moins de
deux publications.
CREATE OR REPLACE PROCEDURE Exception_utilisateur
(Code NUMBER, NOM VARCHAR, AGE Number, N_pub NUMBER) IS
Erreur_candidqtTropJeune EXCEPTION ; Déclo ration des exceptions
Erreur_condidatNonExperimente EXCEPTION;

BEGIN
lnsert INTO Condidat (num-cand, nom_cond, age_cand, pub)
Values (CODE, NOM, AGE, N_pub);
lF AGE < 78 THEN RAISE erreur-candidstTropleune; Vclidation de I'insertion
END IF;
lF N_pub < 2 THEN RAISE erreur_
END IF;
COMMIT;

EXCEPTION
W H E N e rr e u r_cd ndi d atTropl eun e TH EN
ROLLBACK;
DBMS_OUTPUT. PUT_LINE ('Le condidat est trop jeune',
wH EN co ndidatNon Expefi me nte TH EN
Qestion des exceptions
ROLLBACK;
DBMS_OUTPUT. PUT_LINE ('Le candidat non experimente');

WHEN OTHERSTHEN
DBMS_OUTPUT. PUT_LINE ('Erreur Oracle: 'l ISQLERRM I I '('l I SQLCODE | | ')');
END;

La procédure RAISE_APPLICATION_ERROR permet de définir ses propres messages et codes d'erreurs,


Cette procédure évite le renvoi d'exceptions non traitées car le numéro d'erreur (inclus dans
RAISE_APPLICATION_ERROR) sera communiqué à l'environnement appelant. Svntaxe :
RAISE-APPLICATION_ERROR (Numéro_Erreur, Message [, {TRUE I FALSE}]) ;
. Numéro_Erreur : définie par I'utilisateur pour l'exception, comprise entre -20 000 et -20 999 ;
. Message : chaîne de caractères (max 2 048 octets) décrivant l'erreur.
. TRUE I 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.
DECLARE
AGE Number;
BEGIN

IF AGE < 18THEN


Ra î s e_Ap pl i c ati o n_E r r o r (-20343, te candidat trop jeune. ),'
END IF;

END;
Dans cet exemple, le numéro d'erreur -20343 est levé si la valeur de Age n'est pas supérieure à 18,
produisant un message qui ressemble à ceci : ORA-20343 : Le candidat est trop jeune.

27 BDll - Pr. M.E,H CHARAF

You might also like