1. Copyright Oracle Corporation, 1998. All rights reserved.
8
Traitement des Exceptions
2. 8-2 Copyright Oracle Corporation, 1998. All rights reserved.
Objectifs
A la fin de ce chapitre, vous saurez :
• Définir des exceptions PL/SQL
• Reconnaître les exceptions non gérées
• Lister et utiliser les différents types de
traitements des exceptions PL/SQL
• Traiter les erreurs Oracle non pré-définies
• Décrire l'effet d'une propagation des erreurs
dans des blocs imbriqués
• Personnaliser les messages d’erreur PL/SQL
3. 8-3 Copyright Oracle Corporation, 1998. All rights reserved.
Manipuler les Exceptions en PL/SQL
• Qu’est-ce qu’une exception ?
– Un identifiant PL/SQL, de type erreur,
déclenché pendant l’exécution du bloc
• Comment est-elle déclenchée ?
– Implicitement, par une erreur Oracle
– Explicitement, par le programme
• Comment la traiter ?
– En l’interceptant dans le traitement des
exceptions
– En la propageant à l’environnement appelant
4. 8-4 Copyright Oracle Corporation, 1998. All rights reserved.
Traitement des Exceptions
Intercepter l’exception
DECLARE
BEGIN
END;
Exception
émise
EXCEPTION
Exception
interceptée
Propager l’exception
DECLARE
BEGIN
END;
Exception
émise
EXCEPTION
Exception non
interceptée
Exception propagée à
l’environnement appelant
5. 8-5 Copyright Oracle Corporation, 1998. All rights reserved.
Types d’Exceptions
• Exception Oracle Pré-définie
• Exception Oracle Non Pré-définie
• Exception définie par l’utilisateur
} Déclenchées
implicitement
Déclenchées
explicitement
6. 8-6 Copyright Oracle Corporation, 1998. All rights reserved.
Intercepter les Exceptions
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
instruction1;
instruction2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
instruction1;
instruction2;
. . .]
[WHEN OTHERS THEN
instruction1;
instruction2;
. . .]
Syntaxe
7. 8-7 Copyright Oracle Corporation, 1998. All rights reserved.
Règles pour intercepter les
Exceptions
• WHEN OTHERS est la dernière clause.
• Le mot-clé EXCEPTION débute la
section de gestion des exceptions.
• Plusieurs Exceptions sont permises.
• Une seule exception est exécutée avant
de sortir d’un bloc.
8. 8-8 Copyright Oracle Corporation, 1998. All rights reserved.
Erreurs Oracle pré-définies
• Utiliser le nom standard à l’intérieur de
la section Exception.
• Exemple d’exceptions pré-définies :
– NO_DATA_FOUND
– TOO_MANY_ROWS
– INVALID_CURSOR
– ZERO_DIVIDE
– DUP_VAL_ON_INDEX
9. 8-10 Copyright Oracle Corporation, 1998. All rights reserved.
Exception pré-définie
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
instruction1;
instruction2;
WHEN TOO_MANY_ROWS THEN
instruction1;
WHEN OTHERS THEN
instruction1;
instruction2;
instruction3;
END;
Syntaxe
10. 8-11 Copyright Oracle Corporation, 1998. All rights reserved.
Erreurs Oracle non pré-définies
Déclarer
• Nommer
l’exception
Associer
• Coder le PRAGMA
EXCEPTION_INIT
Section DECLARE
Traiter
• Traiter
l’exception
déclenchée
Section
EXCEPTION
11. 8-12 Copyright Oracle Corporation, 1998. All rights reserved.
DECLARE
v_deptno dept.deptno%TYPE := &p_deptno;
BEGIN
DELETE FROM dept
WHERE deptno = v_deptno;
COMMIT;
EXCEPTION
WHEN THEN
DBMS_OUTPUT.PUT_LINE('Suppression Impossible du
dep:'||TO_CHAR(v_deptno)||'Employés existant ');
END;
Erreurs Oracle non pré-définies
Intercepter une erreur de violation de
contraintes (Erreur Oracle –2292)
e_emps_remaining EXCEPTION; 1
PRAGMA EXCEPTION_INIT (e_emps_remaining,-2292);
2
e_emps_remaining 3
12. 8-13 Copyright Oracle Corporation, 1998. All rights reserved.
Exceptions définies par
l’utilisateur
• Nommer
l’exception
Déclarer
Section
DECLARE
Déclencher
• Déclencher
explicitement
l’exception avec
RAISE
Section
EXECUTABLE
Traiter
• Traiter
l’exception
declenchée
Section
EXCEPTION
13. 8-14 Copyright Oracle Corporation, 1998. All rights reserved.
Exceptions définies par
l’utilisateur
DECLARE
BEGIN
UPDATE product
SET descrip = '&product_description'
WHERE prodid = &product_number;
IF SQL%NOTFOUND THEN
END IF;
COMMIT;
EXCEPTION
WHEN THEN
DBMS_OUTPUT.PUT_LINE('Numéro de produit invalide.');
END;
exemple
e_invalid_product EXCEPTION; 1
RAISE e_invalid_product; 2
e_invalid_product 3
14. 8-15 Copyright Oracle Corporation, 1998. All rights reserved.
Fonctions d’interception des
Erreurs
• SQLCODE
Renvoie la valeur numérique associé au
code de l’erreur
• SQLERRM
Renvoie le message associé au code de
l’erreur
15. 8-16 Copyright Oracle Corporation, 1998. All rights reserved.
Fonctions d’interception des
Erreurs
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO erreurs VALUES(v_error_code,
v_error_message);
END;
exemple
SQLCODE
SQLERRM
16. 8-17 Copyright Oracle Corporation, 1998. All rights reserved.
Environnements appelants
SQL*Plus
Procedure
Builder
Oracle
Developer
Forms
Une application
du précompilateur
Un bloc PL/SQL
principal
Affiche le code erreur et le message à
l’écran
Affiche le code erreur et le message à
l’écran
Accède facilement au code et au
message d’erreur à l’aide des
fonctions ERROR_CODE et
ERROR_TEXT
Accède au code erreur grâce à la
structure de données SQLCA
Intercepte les exceptions dans la
section Exceptions des blocs maîtres
17. 8-18 Copyright Oracle Corporation, 1998. All rights reserved.
Propagations des Exceptions
BEGIN
SELECT ...
UPDATE ...
IF SQL%NOTFOUND THEN
RAISE e_no_rows;
END IF;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
DECLARE
. . .
e_no_rows exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN . . .
WHEN TOO_MANY_ROWS THEN . . .
END;
Des sous-blocs
peuvent traiter une
exception ou la
transmettre à un bloc
de niveau supérieur.
BEGIN
SELECT ...
UPDATE ...
IF SQL%NOTFOUND THEN
RAISE e_no_rows;
END IF;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
18. 8-19 Copyright Oracle Corporation, 1998. All rights reserved.
Procédure
RAISE_APPLICATION_ERROR
Syntaxe
• Cette procédure vous permet de délivrer
des messages d’erreur définis par
l’utilisateur à partir de sous-programmes
stockés
• Elle ne peut être appelée que durant
l’exécution d’un sous-programme stocké
dans la base de données
raise_application_error (error_number,
message[, {TRUE | FALSE}]);
19. 8-20 Copyright Oracle Corporation, 1998. All rights reserved.
Procédure
RAISE_APPLICATION_ERROR
• Elle peut être utilisée à deux endroits :
– Dans la Section Exécutable
– Dans le Section Exception
• Elle renvoie à l’utilisateur les conditions
de l’erreur de manière cohérente par
rapport aux erreurs du Serveur Oracle
20. 8-21 Copyright Oracle Corporation, 1998. All rights reserved.
Résumé
• Types d’Exceptions :
– Erreur Oracle Server pré-définie
– Erreur Oracle Server non pré-définie
– Erreur définie par l’utilisateur
• Interception des Exceptions
• Traitement des Exceptions :
– intercepter l’exception dans un bloc
PL/SQL.
– Propager l’exception.
21. 8-22 Copyright Oracle Corporation, 1998. All rights reserved.
Présentation de l’exercice
• Traiter des exceptions nommées
• Créer et faire référence à des
exceptions définies par l’utilisateur