PL /SQL Les exceptions

PL /SQL









Introduction
Bloc PL/SQL
Déclaration des variable
Structure de contrôle
Curseurs
Les exceptions
p
Les fonctions et procédures
Les packages
Les triggers
2013-2014
N.EL FADDOULI
1
Les exceptions



Définition
Exceptions prédéfinies
Exception définie par l'utilisateur
2013-2014
N.EL FADDOULI
38
Page 1
Exceptions: 2 types


C’est un mécanisme permettant de dérouter l’exécution normale du bloc vers la
section Exception
Exception..
Exceptions définies par ORACLE





Nommées par oracle
Exemples: NO_ DATA_FOUND,
DATA_FOUND, TOO_MANY_ROWS
TOO_MANY_ROWS,, ….
Se déclenchent automatiquement
Nécessite de prévoir la prise en compte de l’erreur dans la section EXCEPTION
Exceptions définies par l’utilisateur
Nommées p
par l’utilisateur.
Arrêt de l’exécution du bloc
 Sont déclenchées par une instruction du programme soit automatiquement ( PRAGMA
PRAGMA))
 Nécessite de prévoir la prise en compte de l’erreur dans la section EXCEPTION



Oracle fournit les fonctions SQLCODE et SQLTERRM
SQLTERRM,, qui renvoient
respectivement le code et le message d'erreur correspondant à l'exception
l'exception..
2013-2014
N.EL FADDOULI
39
Exceptions prédéfinies: exemple
Exemple::
Exemple
DECALRE
SAL empl.salaire%type
empl salaire%type
empl.salaire
salaire%type ;
BEGIN
SELECT salaire into SAL FROM employe WHERE ville='RABAT' ;
…..
EXCEPTION
WHEN TOO_MANY_ROWS THEN traitements ;
WHEN NO_DATA_FOUND THEN traitements .
WHEN OTHERS THEN
dbms_output..put_line
dbms_output
put_line('Code
('Code d'erreur:'||
d'erreur:'||SQLCODE
SQLCODE);
);
dbms_output..put_line
dbms_output
put_line('Message
('Message d'erreur:'||SQLERRM
d'erreur:'||SQLERRM);
);
END;
2013-2014
N.EL FADDOULI
40
Page 2
Exceptions

Fonctionnement: lorsqu’une exception est détectée, il y a:





2013-2014
Arrêt de l’exécution du bloc
Branchement sur la section exception
Parcours des clauses WHEN jusqu’à la bonne
Exécution des instructions associées
Une fois le traitement de l’erreur terminé,, c’est le bloc suivant qui
q est effectué.
N.EL FADDOULI
41
Exceptions prédéfinies
ACESS_INTO_NULL
: On a tenté d'affecter une valeur à un objet non
initialisé ORA
ORA--6530
CASE_NOT_FOUND
CASE_NOT_FOUND:
_
_
: Il n'yy a p
pas de choix WHEN correspondant
p
dans une
instruction CASE et l'option ELSE n'a pas été définie.
définie. ORA
ORA--6592
INVALID_NUMBER:: PL/SQL exécute un ordre SQL qui ne parvient pas à
INVALID_NUMBER
convertir une chaîne de caractères en nombre.
nombre. ORA
ORA--01722
NO_DATA_FOUND:: Cette exception est déclenchée dans trois cas
NO_DATA_FOUND
cas::
- Un ordre SELECT INTO qui ne ramène aucun enregistrement
enregistrement..
- On référence une ligne
g non initialisée d'une table PL/SQL
/ Q
- On tente de lire après la fin d'un fichier avec le package UTL_FILE
ORA--01403
ORA
TOO_MANY_ROWS:: SELECT INTO a ramené plus d'une ligne ORA
TOO_MANY_ROWS
ORA--01422
2013-2014
N.EL FADDOULI
42
Page 3
Exceptions prédéfinies: Exercice
1) Ecrire un bloc PL/SQL qui:
qui:
-
Lit deux entiers A et B
-
Calcule et affiche la division de A par B
2) Exécuter le bloc pour B=
B=00. Que remarqueremarque-t-on?
3) Modifier le bloc pour traiter
l'exception levée en affichant un message
approprié..
approprié
2013-2014
N.EL FADDOULI
43
Exception définie par l’utilisateur

Déclaration d’une variable de type EXCEPTION dans la section
DECLARE
 Nom_exception EXCEPTION

Définition du traitement associé


WHEN Nom_exception THEN traitements ;
Déclenchement:

Soit associer à cette erreur un code ORACLE, elle sera levée automatiquement:


PRAGMA EXCEPTION_INIT (Nom_exception , Code_erreur )
Soit lever manuellement l’exception

2013-2014
RAISE Nom_exception ;
N.EL FADDOULI
44
Page 4
Exception définie par l’utilisateur
DECLARE
…..
Nom_exception EXCEPTION;
BEGIN
..................... -- Instructions
IF ( condition_erreur ) THEN RAISE Nom_exception ;
…………….
EXCEPTION
WHEN Nom_exception THEN traitements ;
END ;
Remarques:


on sort du bloc après l’exécution du traitement d’erreur.
Les règles de visibilité des exceptions sont les mêmes que celle des
variables
2013-2014
N.EL FADDOULI
45
Exemple complet
Exemple:: DECLARE
Exemple
CURSOR employe_rabat IS
SELECT nomempl,
nomempl, sal FROM employe WHERE ville= ‘ Rabat’ ;
nom employe.nomempl
employe nomempl %TYPE ;
salaire employe.sal %TYPE ;
ERR_salaire EXCEPTION ;
BEGIN
OPEN client_rabat;
client_rabat;
FETCH employe_rabat INTO nom, salaire ;
WHILE employe_rabat
employe_rabat%
%found LOOP
IF salaire IS NULL THEN
RAISE ERR_salaire ;
…………………..
EXCEPTION
WHEN ERR_salaire THEN
INSERT INTO temp ( nomempl,
nomempl, ‘ salaire non définie’ ) ;
WHEN NO_DATA_FOUND THEN
INSERT INTO temp ( nomempl,
nomempl, ‘ non trouvé’ ) ;
END ;
2013-2014
N.EL FADDOULI
46
Page 5
Exception "others "




Exception prédéfinie porte le nom de others
Permet de traiter toute autre exception non prévue
Syntaxe : WHEN OTHERS THEN …
Deux fonctions permettent de récupérer des informations sur l’erreur oracle:


Sqlcode: retourne une valeur numérique : numéro de l’erreur.
Sqlcode:
Sqlerrm:: renvoit le libellé de l’erreur.
Sqlerrm
2013-2014
N.EL FADDOULI
47
Exemple complet
Exemple:: DECLARE
Exemple
salaire employe.sal %TYPE ;
SAL_nulle EXCEPTION ;
code number ;
message char (50
(50);
);
BEGIN
SELECT sal INTO salaire from employe;
IF salaire= 0 THEN
RAISE SAL_nulle
SAL_nulle;; END IF
EXCEPTION
WHEN SAL_nulle THEN
...... -- gérer erreur salaire
WHEN TOO_MANY_ROWS THEN
....... -- gérer erreur trop de lignes
WHEN NO_DATA_FOUND THEN
........ -- gérer erreur pas de lignes
WHEN OTHERS THEN
-- gérer toutes les autres erreurs
code:= sqlcode ;
message:= sqlerrm ;
dbms_output..put_line ( ‘erreur: ‘ || code || message );
dbms_output
END ;
2013-2014
N.EL FADDOULI
48
Page 6