Professional Documents
Culture Documents
BDII - Partie4
BDII - Partie4
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.
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).
DECLARE
/* Déclarotion des variables */
BEGIN
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;
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.
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;
:,|{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 "
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).
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:
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,
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.
/*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
WHEN OTHERSTHEN 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.
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.
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.
. 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.
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;
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.