Chapitre 5: Gestion des erreurs
1
1. Introduction
En PL/SQL, la gestion des erreurs se fait grâce aux
exceptions.
Il existe de nombreuses exceptions prédéfinies (dans
le package STANDARD)
Le programmeur peut aussi définir de nouvelles
exceptions
Le programmeur peut explicitement déclencher une
exception (raise)
Le programmeur peut traiter des exceptions.
2
2. Les Exceptions et les codes d’erreur
PL/SQL a défini des exceptions pour certaines
erreurs Oracle. Par exemple
exception TOO_MANY_ROWS
= erreur Oracle ORA-01422 (code erreur -1422)
Pour lier une exception `a un code d’erreur SQL :
PRAGMA EXCEPTION_INIT(nom_exception, code_erreur);
3
Déclenchement d’exception
Une erreur à l’exécution déclenche une exception (par exemple
une division par 0 déclenche l’exception ZERO_DIVIDE)
Dans un programme, on déclenche explicitement une exception
grâce à l’instruction raise nom_exception
Pour déclencher une erreur qui n’est pas liée à une exception,
utiliser l’instruction :
raise_application_error (num_erreur, message);
num_erreur est un entier négatif compris entre -20999 et
-20000
(codes réservés aux erreurs de l’utilisateur)
message est une chaine de caractère.
4
3. Traitement d’exception
Dans un bloc PL/SQL, il peut y avoir une partie traitement
d’exception :
EXCEPTION
WHEN exception_1 THEN
-- on traite l’exception_1
WHEN exception_2 THEN
-- on traite l’exception_2
...
WHEN OTHERS THEN -- optionnel
-- on traite toutes les exceptions
-- et erreurs non traitées auparavant
END;
5
3. Traitement d’exception (exemple)
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings INTO pe_ratio
FROM stocks
WHERE symbol = ’XYZ’;
-- peut causer la division par zéro (erreur)
INSERT INTO stats (symbol, ratio)
VALUES (’XYZ’, pe_ratio);
EXCEPTION
WHEN ZERO_DIVIDE THEN
INSERT INTO stats (symbol, ratio)
VALUES (’XYZ’, NULL);
END;
6
3. Traitement d’exception (exemple)
On suppose qu’il existe une table COMPAGNIE et une table
PILOTE avec une contrainte de clé étrangère entre les deux (un
pilote appartient `a une compagnie)
Lorsqu’on veut supprimer une compagnie qui a encore des pilotes :
ORA-02292 enregistrement fils existant.
DECLARE
restePilote EXCEPTION ;
PRAGMA Exception_init(restePilote, -2292);
BEGIN
delete from compagnie where comp = ’MaCompagnie’ ;
...
EXCEPTION
when restePilote then
... traitement de l’erreur ...
END;
7