Vous êtes sur la page 1sur 23

8

Traiter les exceptions

Copyright © Oracle, 2004. Tous droits réservés.


Objectifs

A la fin de ce chapitre, vous pourrez :


• définir des exceptions PL/SQL
• reconnaître les exceptions non gérées
• répertorier et utiliser les différents types de
gestionnaire d'exceptions PL/SQL
• intercepter les erreurs non prédéfinies
• décrire l'effet de la propagation des exceptions
dans des blocs imbriqués
• personnaliser les messages d'exception PL/SQL

Copyright © Oracle, 2004. Tous droits réservés.


Exemple

SET SERVEROUTPUT ON
DECLARE
lname VARCHAR2(15);
BEGIN
SELECT last_name INTO lname FROM employees WHERE

first_name='John';
DBMS_OUTPUT.PUT_LINE ('John''s last name is : '
||lname);
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Exemple

SET SERVEROUTPUT ON
DECLARE
lname VARCHAR2(15);
BEGIN
SELECT last_name INTO lname FROM employees WHERE

first_name='John';
DBMS_OUTPUT.PUT_LINE ('John''s last name is : '
||lname);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (' Your select statement
retrieved multiple rows. Consider using a
cursor.');
END;
/
Copyright © Oracle, 2004. Tous droits réservés.
Traiter les exceptions en langage PL/SQL

• Une exception est une erreur PL/SQL détectée


pendant l'exécution du programme.
• Une exception peut être générée :
– Implicitement par le serveur Oracle
– Explicitement par le programme
• Une exception peut être traitée :
– Par interception à l'aide d'un gestionnaire
– Par propagation vers l'environnement appelant

Copyright © Oracle, 2004. Tous droits réservés.


Traiter les exceptions

L'exception Interrompre
est-elle brutalement
interceptée ? l'exécution
Non

Oui
Exception Exécuter les
instructions Propager
générée
de la section l'exception
EXCEPTION

Interrompre
correctement
l'exécution

Copyright © Oracle, 2004. Tous droits réservés.


Types d'exception

}
• Exception prédéfinie Exception
du serveur Oracle déclenchée
implicitement
• Exception non prédéfinie
du serveur Oracle

• Exception définie Exception déclenchée


par l'utilisateur explicitement

Copyright © Oracle, 2004. Tous droits réservés.


Intercepter les exceptions

Syntaxe :
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]

Copyright © Oracle, 2004. Tous droits réservés.


Règles d'interception des exceptions

• Le mot-clé EXCEPTION débute la section de


traitement des exceptions.
• Plusieurs gestionnaires d'exceptions sont
autorisés.
• Un seul gestionnaire est traité avant la sortie du
bloc.
• WHEN OTHERS est la dernière clause.

Copyright © Oracle, 2004. Tous droits réservés.


Intercepter les erreurs prédéfinies
du serveur Oracle

• Utilisez le nom prédéfini à l'intérieur du sous-


programme de traitement des exceptions.
• Exemples d'exceptions prédéfinies :
– NO_DATA_FOUND
– TOO_MANY_ROWS
– INVALID_CURSOR
– ZERO_DIVIDE
– DUP_VAL_ON_INDEX

Copyright © Oracle, 2004. Tous droits réservés.


Intercepter les erreurs non prédéfinies
du serveur Oracle

Déclarer Associer Référencer

Section déclarative Section EXCEPTION

Nommer Coder PRAGMA Traiter l'exception


l'exception EXCEPTION_INIT déclenchée

Copyright © Oracle, 2004. Tous droits réservés.


Erreur non prédéfinie

Intercepter l'erreur numéro –01400 du serveur Oracle,


impossible d'insérer la valeur NULL
SET SERVEROUTPUT ON
DECLARE
insert_excep EXCEPTION; 1
PRAGMA EXCEPTION_INIT
(insert_excep, -01400); 2
BEGIN
INSERT INTO departments
(department_id, department_name) VALUES (280, NULL);
EXCEPTION 3
WHEN insert_excep THEN
DBMS_OUTPUT.PUT_LINE('INSERT OPERATION FAILED');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Fonctions d'interception des exceptions

• SQLCODE : renvoie la valeur numérique du code


d'erreur
• SQLERRM : renvoie le message associé au code
d'erreur

Copyright © Oracle, 2004. Tous droits réservés.


Fonctions d'interception des exceptions

Exemple :
DECLARE
error_code NUMBER;
error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
error_code := SQLCODE ;
error_message := SQLERRM ;
INSERT INTO errors (e_user, e_date, error_code,
error_message) VALUES(USER,SYSDATE,error_code,
error_message);
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Intercepter les exceptions définies par
l'utilisateur

Déclarer Déclencher Référencer

Section Section Section de traitement


déclarative exécutable des exceptions

Nommer Déclencher Traiter l'exception


l'exception explicitement déclenchée
l'exception via
l'instruction
RAISE

Copyright © Oracle, 2004. Tous droits réservés.


Intercepter les exceptions définies
par l'utilisateur
...
ACCEPT deptno PROMPT 'Please enter the department number:'
ACCEPT name PROMPT 'Please enter the department name:'
DECLARE
invalid_department EXCEPTION; 1
name VARCHAR2(20):='&name';
deptno NUMBER :=&deptno;
BEGIN
UPDATE departments
SET department_name = name
WHERE department_id = deptno;
IF SQL%NOTFOUND THEN
RAISE invalid_department; 2
END IF;
COMMIT;
EXCEPTION
3
WHEN invalid_department THEN
DBMS_OUTPUT.PUT_LINE('No such department id.');
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Environnements appelants

iSQL*Plus Affiche le code d'erreur et le message à


l'écran

Procedure Builder Affiche le code d'erreur et le message à


l'écran
Oracle Developer Accède au code et au message d'erreur au
Forms
sein d'un déclencheur (trigger) ON-ERROR
en utilisant les fonctions intégrées
ERROR_CODE et ERROR_TEXT
Application Accède au code d'erreur via la structure de
précompilée
données SQLCA
Bloc PL/SQL Intercepte les exceptions dans le sous-
englobant programme de traitement des exceptions
du bloc englobant

Copyright © Oracle, 2004. Tous droits réservés.


Propagation des exceptions
d'un sous-bloc
DECLARE
. . .
no_rows exception;
integrity exception;
PRAGMA EXCEPTION_INIT (integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
Des sous-blocs BEGIN
SELECT ...
peuvent traiter une UPDATE ...
exception ou la IF SQL%NOTFOUND THEN
transmettre à un bloc RAISE no_rows;
englobant. END IF;
END;
END LOOP;
EXCEPTION
WHEN integrity THEN ...
WHEN no_rows THEN ...
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Procédure RAISE_APPLICATION_ERROR

Syntaxe :
raise_application_error (error_number,
message[, {TRUE | FALSE}]);

• Vous pouvez utiliser cette procédure pour générer


des messages d'erreur définis par l'utilisateur à
partir de sous-programmes stockés.
• Elle permet de signaler les erreurs à l'application
et d'éviter le renvoi d'exceptions non traitées.

Copyright © Oracle, 2004. Tous droits réservés.


Procédure RAISE_APPLICATION_ERROR

• Elle peut être utilisée à deux endroits :


– Section exécutable
– Section de traitement des exceptions
• Elle renvoie à l'utilisateur les conditions de l'erreur
de manière cohérente par rapport aux autres
erreurs du serveur Oracle.

Copyright © Oracle, 2004. Tous droits réservés.


RAISE_APPLICATION_ERROR

Section exécutable :
BEGIN
...
DELETE FROM employees
WHERE manager_id = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,
'This is not a valid manager');
END IF;
...

Section de traitement des exceptions :


...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Manager is not a valid employee.');
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Synthèse

Ce chapitre vous a permis d'apprendre à :


• définir des exceptions PL/SQL
• ajouter une section EXCEPTION au bloc PL/SQL
afin de traiter les exceptions lors de l'exécution
• gérer différents types d'exception :
– exceptions prédéfinies
– exceptions non prédéfinies
– exceptions définies par l'utilisateur
• propagation des exceptions dans des blocs
imbriqués et appeler des applications

Copyright © Oracle, 2004. Tous droits réservés.


Présentation de l'exercice 8

Cet exercice porte sur les points suivants :


• traiter des exceptions nommées
• créer et appeler des exceptions définies par
l'utilisateur

Copyright © Oracle, 2004. Tous droits réservés.

Vous aimerez peut-être aussi