Documente Academic
Documente Profesional
Documente Cultură
8-2
Traiter des exceptions en PL/SQL
8-3
Traiter des exceptions en PL/SQL
• Intercepter une exception
– Si une exception se déclenche dans la section exécutable
du bloc, le programme effectue un branchement sur le
gestionnaire d'exceptions correspondant dans la section de
traitement des exceptions du bloc. Si PL/SQL traite
convenablement l'exception, celle-ci n'est pas propagée au
bloc englobant ou à l'environnement appelant. Le bloc
PL/SQL s'exécute correctement.
• Propager une exception
– Si une exception se produit dans la section exécutable du
bloc et qu'il n'y a pas de gestionnaire d'exceptions
correspondant, le bloc PL/SQL aboutit à une erreur et
l'exception est propagée à l'environnement appelant.
8-4
Traiter les exceptions
DECLARE DECLARE
BEGIN BEGIN
Exception Exception
déclenchée déclenchée
EXCEPTION EXCEPTION
Exception Exception
interceptée
END; END; non
interceptée
Exception propagée
à l'environnement
appelant
8-5
Types d'exception
8-6
Intercepter les exceptions
Syntaxe :
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
8-7
Règles d'interception des exceptions
8-8
Intercepter les erreurs prédéfinies
du serveur Oracle
8-9
Exceptions prédéfinies
Syntaxe :
BEGIN
. . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
8-10
Intercepter les erreurs non prédéfinies
du serveur Oracle
8-12
Fonctions d'interception des exceptions
8-13
Fonctions d'interception des exceptions
Exemple :
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 errors
VALUES(v_error_code, v_error_message);
END;
8-14
Intercepter les exceptions définies
par l'utilisateur
8-15
Exceptions définies par l'utilisateur
Exemple :
DEFINE p_department_desc = 'Information Technology '
DEFINE P_department_number = 300
DECLARE
e_invalid_department EXCEPTION; 1
BEGIN
UPDATE departments
SET department_name = '&p_department_desc'
WHERE department_id = &p_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department; 2
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN 3
DBMS_OUTPUT.PUT_LINE('No such department id.');
END;
8-16
Environnements appelants
8-17
Propager des exceptions
DECLARE
. . .
e_no_rows exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
Des sous-blocs SELECT ...
UPDATE ...
peuvent traiter une IF SQL%NOTFOUND THEN
exception ou la RAISE e_no_rows;
END IF;
transmettre à un bloc END;
englobant. END LOOP;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
8-18
Procédure RAISE_APPLICATION_ERROR
Syntaxe :
raise_application_error (error_number,
message[, {TRUE | FALSE}]);
8-19
Procédure RAISE_APPLICATION_ERROR
8-20
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;
...
8-21
Synthèse
• Types d'exception :
– erreur prédéfinie du serveur Oracle
– erreur non prédéfinie du serveur Oracle
– erreur définie par l'utilisateur
• Intercepter une exception
• Traiter une exception :
– intercepter l'exception dans un bloc PL/SQL.
– propager l'exception.
8-22