SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
88
Mostafa Hanoune
Traitement des Exceptions
Les Bases PL/SQL 8-2
Objectifs
Dans ce chapitre, vous apprendrez ce que sont les exceptions PL/SQL et comment on les traite en utilisant
des mot-clés pré-définis, non pré-définis ou définis par l’utilisateur.
8-2
Mostafa Hanoune
Objectifs
A la fin de ce chapitre, vous saurez :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
Les Bases PL/SQL 8-3
Présentation
Une exception est un identifiant PL/SQL généré au cours de l’exécution d’un bloc qui termine le corps
principal des instructions. Un bloc s’arrête quand une exception PL/SQL est déclenchée, cependant vous
pouvez spécifier un traitement dans les exceptions afin de réaliser des instructions finales.
Deux méthodes pour déclencher une Exception
• Lorsqu’une erreur Oracle se produit, l’exception associée est émise automatiquement. Par exemple,
si l’erreur ORA-01403 survient car un SELECT n’a ramenée aucune ligne, alors le PL/SQL émet
l’exception NO_DATA_FOUND.
• Vous pouvez produire explicitement une exception en insérant une instruction RAISE dans un bloc.
L’exception ainsi émise peut être soit définie par l’utilisateur, soit pré-définie.
8-3
Mostafa Hanoune
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
Les Bases PL/SQL 8-4
Interception d’une Exception
Si une exception se produit dans la partie exécutable du bloc, le traitement se débranche au sous-
programme correspondant dans la section Exception du bloc. Si le PL/SQL traite convenablement
l’exception, alors elle n’est pas propagée au le bloc supérieur ou vers l’environnement appelant. Le bloc
PL/SQL s’exécute correctement.
Propagation d’une Exception
Si une exception se produit dans la partie exécutable du bloc et s’il n’y a pas de sous-programme lui
correspondant, alors le bloc PL/SQL aboutit à une erreur et l’exception est propagée à l’environnement
appelant.
8-4
Mostafa Hanoune
Traitement des Exceptions
Intercepter lIntercepter l’’exceptionexception
DECLAREDECLARE
BEGINBEGIN
END;END;
ExceptionException
éémisemise
EXCEPTIONEXCEPTION
ExceptionException
interceptinterceptééee
Propager lPropager l’’exceptionexception
DECLAREDECLARE
BEGINBEGIN
END;END;
ExceptionException
éémisemiseEXCEPTIONEXCEPTION
Exception nonException non
interceptinterceptééee
Exception propagException propagééee àà
ll’’environnement appelantenvironnement appelant
Les Bases PL/SQL 8-5
8-5
Mostafa Hanoune
Types d’Exceptions
• Exception Oracle Pré-définie
• Exception Oracle Non Pré-définie
• Exception définie par l’utilisateur
}} DDééclenchclenchééeses
implicitementimplicitement
DDééclenchclenchééeses
explicitementexplicitement
Types d’Exceptions
Vous pouvez utiliser des exceptions dans vos programmes pour éviter des interruptions en cours
d’exécution. Il existe trois types d’exceptions :
Note : Certains outils d'application PL/SQL avec une interface côté client, comme Oracle Developer
Forms, possèdent leurs propres exceptions.
Exception Description Indications de traitement
Erreur prédéfinie du
serveur Oracle
Une des 20 erreurs qui arrivent
le plus fréquemment en langage
PL/SQL
Ne pas la déclarer et laisser
Oracle Server l’émettre
implicitement
Erreur non prédéfinie
du serveur Oracle
Toute autre erreur standard
d’Oracle Server
La déclarer à l’intérieur du
segment de déclaration et laisser
Oracle Server l’émettre
implicitement
Erreur définie par
l’utilisateur
Une condition que le
programmeur définit comme
anormale
La déclarer à l’intérieur du
segment de déclaration et
déclencher son émission
explicitement
Les Bases PL/SQL 8-6
8-6
Mostafa Hanoune
Intercepter les Exceptions
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
instruction1;
instruction2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
instruction1;
instruction2;
. . .]
[WHEN OTHERS THEN
instruction1;
instruction2;
. . .]
SyntaxeSyntaxe
Interception d’Exceptions
Vous pouvez intercepter n’importe quelle erreur en insérant les instructions correspondantes, à l’intérieur
de la section Exception du bloc PL/SQL. Chaque traitement d’exception contient une commande WHEN,
qui spécifie les conditions de l’exception, suivie d’une séquence d’instructions à exécuter lorsque cette
exception est déclenchée.
Syntaxe :
exception Nom standard de l’exception pré-définie ou bien définie par
l’utilisateur et déclarer dans la section déclarative.
Statement Une ou plusieurs instructions SQl ou PL/SQL
OTHERS Clause de traitement d’Exception Optionnelle, qui intercepte toutes les
exceptions non gérées dans la même section d’exception.
Exception WHEN OTHERS
La section Exception intercepte seulement celles qui ont été définies ; toutes les autres exceptions ne sont
pas interceptées sauf si vous précisez la clause WHEN OTHERS. Ceci permet d’intercepter toute
exception qui n’a pas encore été traitée. C’est pourquoi OTHERS doit être la dernière instruction de la
section Exception.
La commande OTHERS intercepte toutes les exceptions qui ne l’ont pas déjà été. Certains outils Oracle
ont leurs propres exceptions pré-définies que vous pouvez utiliser pour provoquer certaines actions.
OTHERS intercepte également ces exceptions.
Les Bases PL/SQL 8-7
Règles
• Commencer la section Exception du bloc par le mot clé EXCEPTION.
• Définir plusieurs traitements d’Exceptions pour un bloc, chacune ayant sa propre séquence
d’actions.
• Lorsqu’une exception se produit, le PL/SQL n’exécute qu’une Seule traitement avant de sortir du
bloc.
• Placer la commande OTHERS après toutes les autres commandes de traitement d’exceptions.
• Vous pouvez employer au plus une commande OTHERS.
• Les exceptions ne peuvent pas intervenir dans les instructions d’assignation ou dans les instructions
SQL.
8-7
Mostafa Hanoune
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.
Les Bases PL/SQL 8-8
Interception des erreurs Oracle pré-définies
Intercepter une erreur Oraclepré-définie en utilisant son nom standard à l’intérieur de la section
d’Exception.
Pour connaître la liste complète des exceptions pré-définies, voir
PL/SQL User’s Guide and Reference, Release 8, “Error Handling.”
Note : Le PL/SQL déclare les exceptions pré-définies dans le Package STANDARD.
Il est bon de toujours penser à gérer les exceptions NO_DATA_FOUND et TOO_MANY_ROWS qui
sont les plus courantes.
8-8
Mostafa Hanoune
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
Les Bases PL/SQL 8-9
Exceptions pré-définies
Nomde l’Exception
Code
Erreur
Oracle
Server
Description
ACCESS_INTO_NULL ORA-06530 Assignation d’une valeur à un objet non
initialisé
COLLECTION_IS_NULL ORA-06531 Utilisationd’une méthodeautre que EXISTS
sur une nested table non initialisée ou un varray
CURSOR_ALREADY_OPEN ORA-06511 Ouvertured’un curseur déjà ouvert
DUP_VAL_ON_INDEX ORA-00001 Insertion d’uneligneen doublon
INVALID_CURSOR ORA-01001 Opérationinterdite sur un curseur
INVALID_NUMBER ORA-01722 Echec sur une conversion d’une chaîne de
caractères vers du number
LOGIN_DENIED ORA-01017 Connexionà Oracle avec un utilisateur ou un
mot de passe invalide
NO_DATA_FOUND ORA-01403 SELECT mono-ligne retournant 0 ligne
NOT_LOGGED_ON ORA-01012 Echec d’un appel DBdans un programme
PL/SQL car l’utilisateur n’est pas connecté
PROGRAM_ERROR ORA-06501 Le PL/SQL a un problème interne
ROWTYPE_MISMATCH ORA-06504 Incompatibilité detype entreune variable Hôte
et une variablePL/SQL suite à une affectation
STORAGE_ERROR ORA-06500 Dépassement decapacité mémoireou mémoire
corrompue
SUBSCRIPT_BEYOND_COUNT ORA-06533 Référence d’un élément d’une nested table ou
varray en utilisant un indiceplus grand que le
nombre d’éléments dans la collection
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Référence d’un élément d’une nested table ou
varray en utilisant un indicequi sort du
domaineautorisé (-1 par exemple)
TIMEOUT_ON_RESOURCE ORA-00051 Dépassement d’un timeout pour allocation
d’uneressource par Oracle
TOO_MANY_ROWS ORA-01422 SELECT mono-ligne retournant plus d’1 ligne
VALUE_ERROR ORA-06502 Erreur d’arithmétique, de conversion, de
troncature, ou de limite detaille
ZERO_DIVIDE ORA-01476 Division par zéro
Les Bases PL/SQL 8-10
Interception d’exceptions Oracle Server pré-définies
Une seule exception à la fois est déclenchée et traitée.
8-10
Mostafa Hanoune
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;
SyntaxeSyntaxe
Les Bases PL/SQL 8-11
Interception d’erreurs Oracle non pré-définies
Vous pouvez intercepter une erreur Oracle non pré-définie en la déclarant au préalable, ou en utilisant la
commande OTHERS. L’exception déclarée est implicitement déclenchée. En PL/SQL, la clause pragma
EXCEPTION_INIT permet d’associer un nom d’exception à un code d’erreur Oracle. Ceci vous permet de
faire référence à n’importe quelle exception interne Oracle, par un nom et d’écrire un traitement
spécifique pour celle-ci.
Note : PRAGMA (aussi appelé pseudo-instruction) est un mot-clé qui signifie que l’instruction est
destinée au compilateur et qu’elle n’est donc pas traitée au moment de l’exécution du bloc PL/SQL. Plus
précisément, il conduit le compilateur à interpréter toutes les occurrences de l’exception par le code erreur
Oracle Server associé.
8-11
Mostafa Hanoune
Erreurs Oracle non pré-définies
DDééclarerclarer
•• NommerNommer
ll’’exceptionexception
AssocierAssocier
•• Coder le PRAGMACoder le PRAGMA
EXCEPTION_INITEXCEPTION_INIT
Section DECLARESection DECLARE
TraiterTraiter
•• TraiterTraiter
ll’’exceptionexception
ddééclenchclenchééee
SectionSection
EXCEPTIONEXCEPTION
Les Bases PL/SQL 8-12
8-12
Mostafa Hanoune
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 deIntercepter une erreur de violation de
contraintes (Erreur Oraclecontraintes (Erreur Oracle –2292)2292)
e_emps_remaining EXCEPTION; 1
PRAGMA EXCEPTION_INIT (e_emps_remaining,-2292);
2
e_emps_remaining 3
Interception d’une exception Oracle non-prédéfinie
1. Déclarer le nom de l’exception dans la section DECLARE.
Syntaxe
où : exception est le nom de l’exception.
2. Associer l’exception déclarée au code standard de l’erreur Oracle Server en utilisant l’instruction
PRAGMA EXCEPTION_INIT.
Syntaxe
où : exception est l’exception déclarée préalablement.
erreur_number est un code standard de l’erreur Oracle Server.
3. Traiter l’exception ainsi déclarée dans la section EXCEPTION.
Exemple
S’il y a des employés dans un département , affichez un message à l’utilisateur l’informant que ce
département ne peut pas être supprimé.
Pour plus d ’ informations, voir
Oracle Server Messages, Release 8.
exception EXCEPTION;
PRAGMA EXCEPTION_INIT(exception, erreur_number);
Les Bases PL/SQL 8-13
Interception d’exceptions définies par l’utilisateur
Le langage PL/SQL vous permet de définir vos propres exceptions. Les exceptions définies par
l’utilisateur en PL/SQL doivent être :
• Déclarées dans la section DECLARE du bloc PL/SQL
• Déclenchées explicitement à l’aide de l’instruction RAISE
8-13
Mostafa Hanoune
Exceptions définies par
l’utilisateur
•• NommerNommer
ll’’exceptionexception
DDééclarerclarer
SectionSection
DECLAREDECLARE
DDééclencherclencher
•• DDééclencherclencher
explicitementexplicitement
ll’’exception avecexception avec
RAISERAISE
SectionSection
EXECUTABLEEXECUTABLE
TraiterTraiter
•• TraiterTraiter
ll’’exceptionexception
declenchdeclenchééee
SectionSection
EXCEPTIONEXCEPTION
Les Bases PL/SQL 8-14
8-14
Mostafa Hanoune
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;
exempleexemple
e_invalid_product EXCEPTION; 1
RAISE e_invalid_product; 2
e_invalid_product 3
Interception d’exceptions définies par l’utilisateur (suite)
Vous pouvez intercepter une exception définie par l’utilisateur en la déclarant et en la déclenchant
explicitement.
1. Déclarer le nom de l’exception dans la section DECLARE.
Syntaxe
où : exception est le nom de l’exception
2. Utiliser l’instruction RAISE pour déclencher explicitement l’exception dans la section
EXECUTABLE.
Syntaxe
où : exception est l’exception préalablement déclarée
3. Traiter l’exception ainsi déclarée dans la section EXCEPTION.
Exemple
Ce bloc permet de mettre à jour la description d’un produit. L’utilisateur entre le code du produit et sa
nouvelle description. Si l’utilisateur entre un code produit qui n’existe pas, il n’y a pas de ligne mise à
jour dans la table PRODUCT. Une exception est produite et un message s’affiche pour avertir l’utilisateur
qu’il a saisi un code de produit incorrect.
Note : Vous pouvez utiliser l’instruction RAISE à l’intérieur d’un traitement Exceptions pour renvoyer la
même exception à l’environnement appelant.
exception EXCEPTION;
RAISE exception;
Les Bases PL/SQL 8-15
Fonctions d’interception des Erreurs
Lorsqu’une exception se produit, vous pouvez identifier le code et le message d’erreur associé à l’aide de
deux fonctions. Suivant le message ou la valeur du code, vous pouvez décider quelle action effectuer
après cette erreur.
SQLCODE renvoie le code Oracle de l’erreur pour les exceptions internes. Vous pouvez transmettre le
code de l’erreur à SQLERRM, qui renvoie alors le message associé ainsi que le code de l’erreur.
exemple SQLCODE Values
8-15
Mostafa Hanoune
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
Fonction Description
SQLCODE Renvoie la valeur numérique du code de l’erreur (Vous pouvez
l’assigner à une variable de type NUMBER.)
SQLERRM Renvoie la donnée contenant le message associé au code de l’erreur
Valeur SQLCODE Description
0 Pas d’exception enregistrée
1 Exception définie par l’utilisateur
+100 Exception NO_DATA_FOUND
negative number Autre code d’erreur Oracle Server
Les Bases PL/SQL 8-16
8-16
Mostafa Hanoune
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;
exempleexemple
SQLCODE
SQLERRM
Fonctions d’interception des Erreurs
Lorsqu’une exception est interceptée par la clause WHEN OTHERS, vous pouvez utiliser un ensemble de
fonctions standards pour identifier l’erreur.
L’exemple de la diapositive montre comment les valeurs de SQLCODE et SQLERRM peuvent être
assignées dans des variables et celles-ci utilisées dans des instructions SQL.
Il faut tronquer la valeur de SQLERRM à une certaine longueur avant d’essayer de l’écrire dans une
variable.
Note au formateur
N’utilisez pas directement, dans une instruction SQL, les fonctions se rapportant aux erreurs. Assignez
d’abord leurs valeurs dans une variable. Vous pouvez transmettre un code erreur à SQLERRM pour
renvoyer le message associé ; par exemple, “SQLERRM(-979)” renvoie “ORA-0979: not a GROUP BY
expression.” ces fonctions peuvent être utilisées comme de véritables paramètres — par exemple
“erreur_procedure(SQLERRM).”
Les Bases PL/SQL 8-17
Propagation des exceptions
Au lieu d’intercepter une exception dans un bloc PL/SQL, vous pouvez propager l’exception afin de
permettre à l’environnement appelant de la traiter. Chaque environnement a sa propre façon d’accéder et
d’afficher les erreurs.
8-17
Mostafa Hanoune
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
Les Bases PL/SQL 8-18
Propagation d’une exception à partir d’un sous-bloc
Lorsqu’un sous-bloc traite une exception, il se termine normalement,et l’exécution du traitement se
poursuit dans le bloc supérieur, juste après l’instruction END du sous-bloc.
Cependant, si un programme PL/SQL produit une exception et que le bloc ne prévoit pas de la traiter, elle
se propage successivement dans les blocs supérieurs jusqu’à trouver une fonction qui la gère. Si aucun de
ces blocs ne traite l’exception, le résultat donne une exception de non gérée dans l’environnement hôte.
Lorsque l’exception se propage à un bloc supérieur, les actions exécutables restantes de ce bloc sont
ignorées.
Un des avantages de ce comportement est que vous pouvez ainsi inclure des instructions nécessitant leurs
propres fonctions de traitement spécifiques dans leur propre bloc, tout en laissant les exceptions plus
générales être traitées dans le bloc de niveau supérieur.
Note au formateur (Pour la page 8-19)
RAISE_APPLICATION_ERROR ne rentre pas dans le cadre de ce cours car on ne traite pas ici les
unités de programme stockées en base. Elles sont abordées dans un autre cours, OPB. La version actuelle
de ce dernier cours n’introduit pas la notion de RAISE_APPLICATION_ ERROR , mais suppose que les
étudiants y sont familiarisés. Comme le cours développé ici est un prérequis obligatoire à OPB, une
introduction aux RAISE_APPLICATION_ ERROR est fournie avec cette version.
8-18
Mostafa Hanoune
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 sousDes sous--blocsblocs
peuvent traiter unepeuvent traiter une
exception ou laexception ou la
transmettretransmettre àà un blocun bloc
de niveau supde niveau supéérieur.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;
Les Bases PL/SQL 8-19
8-19
Mostafa Hanoune
Procédure
RAISE_APPLICATION_ERROR
SyntaxeSyntaxe
• 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}]);
Utilisez la procédure RAISE_APPLICATION_ERROR pour renvoyer, une exception pré-définie, en
utilisant un code d’erreur non standard et un message d’erreur. Avec RAISE_APPLICATION_ERROR,
vous pouvez reporter des erreurs dans votre application et éviter ainsi de renvoyer des exceptions non
gérées.
Syntaxe :
error_number est un code erreur pour l’exception, spécifié par l’utilisateur,
compris entre –20000 et –20999.
message est le message défini par l’utilisateur pour l’exception. C’est une
chaîne de caractères de taille pouvant aller jusqu’à 2 048 bytes.
TRUE | FALSE est un paramètre Booléen optionnel (Si TRUE, l’erreur est rangée
dans la pile des erreurs précédentes. Si FALSE , valeur par défaut
l’erreur remplace toutes les erreurs précédentes.)
Exemple
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Le manager n’’est pas un employé valide.');
END;
Les Bases PL/SQL 8-20
8-20
Mostafa Hanoune
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
Exemple
...
DELETE FROM emp
WHERE mgr = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_error(-20202,'Ce n’’est pas un manager Valide');
END IF;
...
Les Bases PL/SQL 8-21
8-21
Mostafa Hanoune
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.
Les Bases PL/SQL 8-22
8-22
Mostafa Hanoune
Présentation de l’exercice
• Traiter des exceptions nommées
• Créer et faire référence à des
exceptions définies par l’utilisateur
Aperçu de l’exercice
Dans cet exercice, vous devez créer des fonctions de traitement d’exceptions pour des situations
particulières.
Les Bases PL/SQL 8-23
Exercice 8
1. Ecrire un bloc PL/SQL permettant de sélectionner le nom d’un employé en connaissant le montant
de son salaire.
a. Si le salaire entré, renvoie plus d’une ligne, traiter l’exception avec une fonction
appropriée et insérer dans la table MESSAGES le message suivant : “Plus d’un employé
avec le salaire : <salaire>.”
b. Si le salaire entré ne renvoie aucune ligne, traiter l’exception avec une fonction
appropriée et insérer dans la table MESSAGES le message suivant : “Pas d’employé avec
ce salaire : <salaire>.”
c. Si le salaire entré ne renvoie qu’une ligne, insérer dans la table MESSAGES le nom de
l’employé et le montant de son salaire.
d. Traiter toute autre exception avec une fonction appropriée et insérer dans la table
MESSAGES le message “Autre erreur.”
e. Tester le programme.
RESULTS
--------------------------------------------
SMITH - 800
Plus d’un employé avec le salaire : 3000
Pas d’employé avec le salaire : 6000
2. Modifier p3q3.sql pour ajouter une fonction de traitement des exceptions.
a. Ecrire une fonction de traitement des exceptions pour transmettre un message à
l’utilisateur indiquant que le département n’existe pas.
b. Exécuter le programme PL/SQL en entrant un département qui n’existe pas.
Entrer le numéro de département : 50
Entrer la localité du département :HOUSTON
PL/SQL procedure successfully completed.
G_MESSAGE
--------------------------------------
Le départment 50 n’existe pas
3. Ecrire un programme PL/SQL qui affiche le nombre d’employés qui gagnent 100 $
de plus ou de moins que le montant du salaire donné.
a. S’il n’y a pas d’employés dans cette tranche de salaires, afficher un message à l’utilisateur
en utilisant une exception.
b. S’il y a au moins un employé dans cette tranche de salaires, le message doit indiquer
combien d’employés sont dans cette tranche.
c. Traiter toute autre exception avec une fonction appropriée. Le message doit indiquer
qu’une autre erreur est survenue.
Les Bases PL/SQL 8-24
Exercice 8 (suite)
Entrer le salaire : 800
PL/SQL procedure successfully completed.
G_MESSAGE
----------------------------------------------------------
Il y a 1 employé(s) avec un salaire entre 700 et 900
Entrer le salaire : 3000
PL/SQL procedure successfully completed.
G_MESSAGE
----------------------------------------------------------
Il y a 3 employé(s) avec un salaire entre 2900 et 3100
Entrer le salaire : 6000
PL/SQL procedure successfully completed.
G_MESSAGE
----------------------------------------------------------
Il n’y a pas d’employé avec un salaire entre 5900 et 6100

Weitere ähnliche Inhalte

Was ist angesagt?

Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux javaInes Ouaz
 
Cours c#
Cours c#Cours c#
Cours c#zan
 
Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27megaplanet20
 
Base de donnees Avancees et Intro à NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.pptBase de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à NoSQL.pptIdriss22
 
Pl/sql - interaction avec la base de données & structures de contrôle
Pl/sql  - interaction avec la base de données & structures de contrôlePl/sql  - interaction avec la base de données & structures de contrôle
Pl/sql - interaction avec la base de données & structures de contrôleAbdelouahed Abdou
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement webHouda TOUKABRI
 
Prise en main de Jhipster
Prise en main de JhipsterPrise en main de Jhipster
Prise en main de JhipsterKokou Gaglo
 
Création de Services et Configuration du ESB avec TalendESB
Création de Services et Configuration du ESB avec TalendESBCréation de Services et Configuration du ESB avec TalendESB
Création de Services et Configuration du ESB avec TalendESBLilia Sfaxi
 
chp-6-Les-triggers (1).pptx
chp-6-Les-triggers (1).pptxchp-6-Les-triggers (1).pptx
chp-6-Les-triggers (1).pptxGEEKGHAZI
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Exigences de qualité des systèmes / logiciels
Exigences de qualité des systèmes / logicielsExigences de qualité des systèmes / logiciels
Exigences de qualité des systèmes / logicielsPierre
 
10 Creating Triggers
10 Creating Triggers10 Creating Triggers
10 Creating Triggersrehaniltifat
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correctionInes Ouaz
 

Was ist angesagt? (20)

Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux java
 
Cours c#
Cours c#Cours c#
Cours c#
 
Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27
 
Base de donnees Avancees et Intro à NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.pptBase de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à NoSQL.ppt
 
Pl/sql - interaction avec la base de données & structures de contrôle
Pl/sql  - interaction avec la base de données & structures de contrôlePl/sql  - interaction avec la base de données & structures de contrôle
Pl/sql - interaction avec la base de données & structures de contrôle
 
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo202 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
 
Prise en main de Jhipster
Prise en main de JhipsterPrise en main de Jhipster
Prise en main de Jhipster
 
Création de Services et Configuration du ESB avec TalendESB
Création de Services et Configuration du ESB avec TalendESBCréation de Services et Configuration du ESB avec TalendESB
Création de Services et Configuration du ESB avec TalendESB
 
chp-6-Les-triggers (1).pptx
chp-6-Les-triggers (1).pptxchp-6-Les-triggers (1).pptx
chp-6-Les-triggers (1).pptx
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Exigences de qualité des systèmes / logiciels
Exigences de qualité des systèmes / logicielsExigences de qualité des systèmes / logiciels
Exigences de qualité des systèmes / logiciels
 
Introduction à pl/sql
Introduction à pl/sqlIntroduction à pl/sql
Introduction à pl/sql
 
Approche Mda
Approche MdaApproche Mda
Approche Mda
 
10 Creating Triggers
10 Creating Triggers10 Creating Triggers
10 Creating Triggers
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
 

Andere mochten auch

Garcia islenny producto_3
Garcia islenny producto_3Garcia islenny producto_3
Garcia islenny producto_3andrea_1891
 
Síndrome de activación macrofágica inducido por anfotericina B liposomal
Síndrome de activación macrofágica inducido por anfotericina B liposomalSíndrome de activación macrofágica inducido por anfotericina B liposomal
Síndrome de activación macrofágica inducido por anfotericina B liposomalGerhard Jung, MD, PhD
 
#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)
#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)
#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)yann le gigan
 
"Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ...
"Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ..."Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ...
"Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ...yann le gigan
 
Importancia del internet en las empresas
Importancia del internet en las empresasImportancia del internet en las empresas
Importancia del internet en las empresasEdgar Gualpa
 
Somos como nos comunicamos
Somos como nos comunicamosSomos como nos comunicamos
Somos como nos comunicamosMariposa Tumbaco
 
Trabajo de dibujo tecnico
Trabajo de dibujo tecnico Trabajo de dibujo tecnico
Trabajo de dibujo tecnico luistulcanaza123
 
Biblio corpus références
Biblio corpus référencesBiblio corpus références
Biblio corpus référencesLucileZac
 
Carré Rive Gauche - Revue de presse 2015
Carré Rive Gauche - Revue de presse 2015Carré Rive Gauche - Revue de presse 2015
Carré Rive Gauche - Revue de presse 2015Agence Colonnes
 

Andere mochten auch (20)

Generos en el ciberperiodismo.doc
Generos en el ciberperiodismo.docGeneros en el ciberperiodismo.doc
Generos en el ciberperiodismo.doc
 
Tecnología
TecnologíaTecnología
Tecnología
 
Power tecnologia..
Power tecnologia..Power tecnologia..
Power tecnologia..
 
Cuestionario 4
Cuestionario 4Cuestionario 4
Cuestionario 4
 
Baby on biard
Baby on biardBaby on biard
Baby on biard
 
Cuestionario 1
Cuestionario 1Cuestionario 1
Cuestionario 1
 
Funciones1
Funciones1Funciones1
Funciones1
 
Garcia islenny producto_3
Garcia islenny producto_3Garcia islenny producto_3
Garcia islenny producto_3
 
Síndrome de activación macrofágica inducido por anfotericina B liposomal
Síndrome de activación macrofágica inducido por anfotericina B liposomalSíndrome de activación macrofágica inducido por anfotericina B liposomal
Síndrome de activación macrofágica inducido por anfotericina B liposomal
 
#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)
#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)
#Culture_numerique saison2 - Dentsu Aegis Network (Juin 2015)
 
Práctica tema 3
Práctica tema 3Práctica tema 3
Práctica tema 3
 
"Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ...
"Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ..."Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ...
"Les normes TV sont-elles solubles dans la vidéo en ligne ?" Amplifi (Dentsu ...
 
Importancia del internet en las empresas
Importancia del internet en las empresasImportancia del internet en las empresas
Importancia del internet en las empresas
 
Somos como nos comunicamos
Somos como nos comunicamosSomos como nos comunicamos
Somos como nos comunicamos
 
Trabajo de dibujo tecnico
Trabajo de dibujo tecnico Trabajo de dibujo tecnico
Trabajo de dibujo tecnico
 
Core Values
Core ValuesCore Values
Core Values
 
Biblio corpus références
Biblio corpus référencesBiblio corpus références
Biblio corpus références
 
Lectura3
Lectura3Lectura3
Lectura3
 
Carré Rive Gauche - Revue de presse 2015
Carré Rive Gauche - Revue de presse 2015Carré Rive Gauche - Revue de presse 2015
Carré Rive Gauche - Revue de presse 2015
 
Italie questionnaire sante
Italie questionnaire santeItalie questionnaire sante
Italie questionnaire sante
 

Ähnlich wie Cours08 exceptions

PLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdfPLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdfRihabBENLAMINE
 
7 Programmation PL-SQL Oracle.pdf
7 Programmation PL-SQL Oracle.pdf7 Programmation PL-SQL Oracle.pdf
7 Programmation PL-SQL Oracle.pdfuser2023moi
 
PL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de donnéesPL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de donnéessmiste
 
Plsql
PlsqlPlsql
PlsqlAz Za
 
Sqloracle
SqloracleSqloracle
Sqloracletedy11
 

Ähnlich wie Cours08 exceptions (11)

Les08.ppt
Les08.pptLes08.ppt
Les08.ppt
 
plsql-8.ppt
plsql-8.pptplsql-8.ppt
plsql-8.ppt
 
PLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdfPLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdf
 
7 Programmation PL-SQL Oracle.pdf
7 Programmation PL-SQL Oracle.pdf7 Programmation PL-SQL Oracle.pdf
7 Programmation PL-SQL Oracle.pdf
 
PL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de donnéesPL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de données
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
Plsql
PlsqlPlsql
Plsql
 
Ch11
Ch11Ch11
Ch11
 
Sqloracle
SqloracleSqloracle
Sqloracle
 
Les04.ppt
Les04.pptLes04.ppt
Les04.ppt
 
Les01.ppt
Les01.pptLes01.ppt
Les01.ppt
 

Cours08 exceptions

  • 2. Les Bases PL/SQL 8-2 Objectifs Dans ce chapitre, vous apprendrez ce que sont les exceptions PL/SQL et comment on les traite en utilisant des mot-clés pré-définis, non pré-définis ou définis par l’utilisateur. 8-2 Mostafa Hanoune Objectifs A la fin de ce chapitre, vous saurez :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. Les Bases PL/SQL 8-3 Présentation Une exception est un identifiant PL/SQL généré au cours de l’exécution d’un bloc qui termine le corps principal des instructions. Un bloc s’arrête quand une exception PL/SQL est déclenchée, cependant vous pouvez spécifier un traitement dans les exceptions afin de réaliser des instructions finales. Deux méthodes pour déclencher une Exception • Lorsqu’une erreur Oracle se produit, l’exception associée est émise automatiquement. Par exemple, si l’erreur ORA-01403 survient car un SELECT n’a ramenée aucune ligne, alors le PL/SQL émet l’exception NO_DATA_FOUND. • Vous pouvez produire explicitement une exception en insérant une instruction RAISE dans un bloc. L’exception ainsi émise peut être soit définie par l’utilisateur, soit pré-définie. 8-3 Mostafa Hanoune 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. Les Bases PL/SQL 8-4 Interception d’une Exception Si une exception se produit dans la partie exécutable du bloc, le traitement se débranche au sous- programme correspondant dans la section Exception du bloc. Si le PL/SQL traite convenablement l’exception, alors elle n’est pas propagée au le bloc supérieur ou vers l’environnement appelant. Le bloc PL/SQL s’exécute correctement. Propagation d’une Exception Si une exception se produit dans la partie exécutable du bloc et s’il n’y a pas de sous-programme lui correspondant, alors le bloc PL/SQL aboutit à une erreur et l’exception est propagée à l’environnement appelant. 8-4 Mostafa Hanoune Traitement des Exceptions Intercepter lIntercepter l’’exceptionexception DECLAREDECLARE BEGINBEGIN END;END; ExceptionException éémisemise EXCEPTIONEXCEPTION ExceptionException interceptinterceptééee Propager lPropager l’’exceptionexception DECLAREDECLARE BEGINBEGIN END;END; ExceptionException éémisemiseEXCEPTIONEXCEPTION Exception nonException non interceptinterceptééee Exception propagException propagééee àà ll’’environnement appelantenvironnement appelant
  • 5. Les Bases PL/SQL 8-5 8-5 Mostafa Hanoune Types d’Exceptions • Exception Oracle Pré-définie • Exception Oracle Non Pré-définie • Exception définie par l’utilisateur }} DDééclenchclenchééeses implicitementimplicitement DDééclenchclenchééeses explicitementexplicitement Types d’Exceptions Vous pouvez utiliser des exceptions dans vos programmes pour éviter des interruptions en cours d’exécution. Il existe trois types d’exceptions : Note : Certains outils d'application PL/SQL avec une interface côté client, comme Oracle Developer Forms, possèdent leurs propres exceptions. Exception Description Indications de traitement Erreur prédéfinie du serveur Oracle Une des 20 erreurs qui arrivent le plus fréquemment en langage PL/SQL Ne pas la déclarer et laisser Oracle Server l’émettre implicitement Erreur non prédéfinie du serveur Oracle Toute autre erreur standard d’Oracle Server La déclarer à l’intérieur du segment de déclaration et laisser Oracle Server l’émettre implicitement Erreur définie par l’utilisateur Une condition que le programmeur définit comme anormale La déclarer à l’intérieur du segment de déclaration et déclencher son émission explicitement
  • 6. Les Bases PL/SQL 8-6 8-6 Mostafa Hanoune Intercepter les Exceptions EXCEPTION WHEN exception1 [OR exception2 . . .] THEN instruction1; instruction2; . . . [WHEN exception3 [OR exception4 . . .] THEN instruction1; instruction2; . . .] [WHEN OTHERS THEN instruction1; instruction2; . . .] SyntaxeSyntaxe Interception d’Exceptions Vous pouvez intercepter n’importe quelle erreur en insérant les instructions correspondantes, à l’intérieur de la section Exception du bloc PL/SQL. Chaque traitement d’exception contient une commande WHEN, qui spécifie les conditions de l’exception, suivie d’une séquence d’instructions à exécuter lorsque cette exception est déclenchée. Syntaxe : exception Nom standard de l’exception pré-définie ou bien définie par l’utilisateur et déclarer dans la section déclarative. Statement Une ou plusieurs instructions SQl ou PL/SQL OTHERS Clause de traitement d’Exception Optionnelle, qui intercepte toutes les exceptions non gérées dans la même section d’exception. Exception WHEN OTHERS La section Exception intercepte seulement celles qui ont été définies ; toutes les autres exceptions ne sont pas interceptées sauf si vous précisez la clause WHEN OTHERS. Ceci permet d’intercepter toute exception qui n’a pas encore été traitée. C’est pourquoi OTHERS doit être la dernière instruction de la section Exception. La commande OTHERS intercepte toutes les exceptions qui ne l’ont pas déjà été. Certains outils Oracle ont leurs propres exceptions pré-définies que vous pouvez utiliser pour provoquer certaines actions. OTHERS intercepte également ces exceptions.
  • 7. Les Bases PL/SQL 8-7 Règles • Commencer la section Exception du bloc par le mot clé EXCEPTION. • Définir plusieurs traitements d’Exceptions pour un bloc, chacune ayant sa propre séquence d’actions. • Lorsqu’une exception se produit, le PL/SQL n’exécute qu’une Seule traitement avant de sortir du bloc. • Placer la commande OTHERS après toutes les autres commandes de traitement d’exceptions. • Vous pouvez employer au plus une commande OTHERS. • Les exceptions ne peuvent pas intervenir dans les instructions d’assignation ou dans les instructions SQL. 8-7 Mostafa Hanoune 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. Les Bases PL/SQL 8-8 Interception des erreurs Oracle pré-définies Intercepter une erreur Oraclepré-définie en utilisant son nom standard à l’intérieur de la section d’Exception. Pour connaître la liste complète des exceptions pré-définies, voir PL/SQL User’s Guide and Reference, Release 8, “Error Handling.” Note : Le PL/SQL déclare les exceptions pré-définies dans le Package STANDARD. Il est bon de toujours penser à gérer les exceptions NO_DATA_FOUND et TOO_MANY_ROWS qui sont les plus courantes. 8-8 Mostafa Hanoune 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. Les Bases PL/SQL 8-9 Exceptions pré-définies Nomde l’Exception Code Erreur Oracle Server Description ACCESS_INTO_NULL ORA-06530 Assignation d’une valeur à un objet non initialisé COLLECTION_IS_NULL ORA-06531 Utilisationd’une méthodeautre que EXISTS sur une nested table non initialisée ou un varray CURSOR_ALREADY_OPEN ORA-06511 Ouvertured’un curseur déjà ouvert DUP_VAL_ON_INDEX ORA-00001 Insertion d’uneligneen doublon INVALID_CURSOR ORA-01001 Opérationinterdite sur un curseur INVALID_NUMBER ORA-01722 Echec sur une conversion d’une chaîne de caractères vers du number LOGIN_DENIED ORA-01017 Connexionà Oracle avec un utilisateur ou un mot de passe invalide NO_DATA_FOUND ORA-01403 SELECT mono-ligne retournant 0 ligne NOT_LOGGED_ON ORA-01012 Echec d’un appel DBdans un programme PL/SQL car l’utilisateur n’est pas connecté PROGRAM_ERROR ORA-06501 Le PL/SQL a un problème interne ROWTYPE_MISMATCH ORA-06504 Incompatibilité detype entreune variable Hôte et une variablePL/SQL suite à une affectation STORAGE_ERROR ORA-06500 Dépassement decapacité mémoireou mémoire corrompue SUBSCRIPT_BEYOND_COUNT ORA-06533 Référence d’un élément d’une nested table ou varray en utilisant un indiceplus grand que le nombre d’éléments dans la collection SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Référence d’un élément d’une nested table ou varray en utilisant un indicequi sort du domaineautorisé (-1 par exemple) TIMEOUT_ON_RESOURCE ORA-00051 Dépassement d’un timeout pour allocation d’uneressource par Oracle TOO_MANY_ROWS ORA-01422 SELECT mono-ligne retournant plus d’1 ligne VALUE_ERROR ORA-06502 Erreur d’arithmétique, de conversion, de troncature, ou de limite detaille ZERO_DIVIDE ORA-01476 Division par zéro
  • 10. Les Bases PL/SQL 8-10 Interception d’exceptions Oracle Server pré-définies Une seule exception à la fois est déclenchée et traitée. 8-10 Mostafa Hanoune 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; SyntaxeSyntaxe
  • 11. Les Bases PL/SQL 8-11 Interception d’erreurs Oracle non pré-définies Vous pouvez intercepter une erreur Oracle non pré-définie en la déclarant au préalable, ou en utilisant la commande OTHERS. L’exception déclarée est implicitement déclenchée. En PL/SQL, la clause pragma EXCEPTION_INIT permet d’associer un nom d’exception à un code d’erreur Oracle. Ceci vous permet de faire référence à n’importe quelle exception interne Oracle, par un nom et d’écrire un traitement spécifique pour celle-ci. Note : PRAGMA (aussi appelé pseudo-instruction) est un mot-clé qui signifie que l’instruction est destinée au compilateur et qu’elle n’est donc pas traitée au moment de l’exécution du bloc PL/SQL. Plus précisément, il conduit le compilateur à interpréter toutes les occurrences de l’exception par le code erreur Oracle Server associé. 8-11 Mostafa Hanoune Erreurs Oracle non pré-définies DDééclarerclarer •• NommerNommer ll’’exceptionexception AssocierAssocier •• Coder le PRAGMACoder le PRAGMA EXCEPTION_INITEXCEPTION_INIT Section DECLARESection DECLARE TraiterTraiter •• TraiterTraiter ll’’exceptionexception ddééclenchclenchééee SectionSection EXCEPTIONEXCEPTION
  • 12. Les Bases PL/SQL 8-12 8-12 Mostafa Hanoune 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 deIntercepter une erreur de violation de contraintes (Erreur Oraclecontraintes (Erreur Oracle –2292)2292) e_emps_remaining EXCEPTION; 1 PRAGMA EXCEPTION_INIT (e_emps_remaining,-2292); 2 e_emps_remaining 3 Interception d’une exception Oracle non-prédéfinie 1. Déclarer le nom de l’exception dans la section DECLARE. Syntaxe où : exception est le nom de l’exception. 2. Associer l’exception déclarée au code standard de l’erreur Oracle Server en utilisant l’instruction PRAGMA EXCEPTION_INIT. Syntaxe où : exception est l’exception déclarée préalablement. erreur_number est un code standard de l’erreur Oracle Server. 3. Traiter l’exception ainsi déclarée dans la section EXCEPTION. Exemple S’il y a des employés dans un département , affichez un message à l’utilisateur l’informant que ce département ne peut pas être supprimé. Pour plus d ’ informations, voir Oracle Server Messages, Release 8. exception EXCEPTION; PRAGMA EXCEPTION_INIT(exception, erreur_number);
  • 13. Les Bases PL/SQL 8-13 Interception d’exceptions définies par l’utilisateur Le langage PL/SQL vous permet de définir vos propres exceptions. Les exceptions définies par l’utilisateur en PL/SQL doivent être : • Déclarées dans la section DECLARE du bloc PL/SQL • Déclenchées explicitement à l’aide de l’instruction RAISE 8-13 Mostafa Hanoune Exceptions définies par l’utilisateur •• NommerNommer ll’’exceptionexception DDééclarerclarer SectionSection DECLAREDECLARE DDééclencherclencher •• DDééclencherclencher explicitementexplicitement ll’’exception avecexception avec RAISERAISE SectionSection EXECUTABLEEXECUTABLE TraiterTraiter •• TraiterTraiter ll’’exceptionexception declenchdeclenchééee SectionSection EXCEPTIONEXCEPTION
  • 14. Les Bases PL/SQL 8-14 8-14 Mostafa Hanoune 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; exempleexemple e_invalid_product EXCEPTION; 1 RAISE e_invalid_product; 2 e_invalid_product 3 Interception d’exceptions définies par l’utilisateur (suite) Vous pouvez intercepter une exception définie par l’utilisateur en la déclarant et en la déclenchant explicitement. 1. Déclarer le nom de l’exception dans la section DECLARE. Syntaxe où : exception est le nom de l’exception 2. Utiliser l’instruction RAISE pour déclencher explicitement l’exception dans la section EXECUTABLE. Syntaxe où : exception est l’exception préalablement déclarée 3. Traiter l’exception ainsi déclarée dans la section EXCEPTION. Exemple Ce bloc permet de mettre à jour la description d’un produit. L’utilisateur entre le code du produit et sa nouvelle description. Si l’utilisateur entre un code produit qui n’existe pas, il n’y a pas de ligne mise à jour dans la table PRODUCT. Une exception est produite et un message s’affiche pour avertir l’utilisateur qu’il a saisi un code de produit incorrect. Note : Vous pouvez utiliser l’instruction RAISE à l’intérieur d’un traitement Exceptions pour renvoyer la même exception à l’environnement appelant. exception EXCEPTION; RAISE exception;
  • 15. Les Bases PL/SQL 8-15 Fonctions d’interception des Erreurs Lorsqu’une exception se produit, vous pouvez identifier le code et le message d’erreur associé à l’aide de deux fonctions. Suivant le message ou la valeur du code, vous pouvez décider quelle action effectuer après cette erreur. SQLCODE renvoie le code Oracle de l’erreur pour les exceptions internes. Vous pouvez transmettre le code de l’erreur à SQLERRM, qui renvoie alors le message associé ainsi que le code de l’erreur. exemple SQLCODE Values 8-15 Mostafa Hanoune 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 Fonction Description SQLCODE Renvoie la valeur numérique du code de l’erreur (Vous pouvez l’assigner à une variable de type NUMBER.) SQLERRM Renvoie la donnée contenant le message associé au code de l’erreur Valeur SQLCODE Description 0 Pas d’exception enregistrée 1 Exception définie par l’utilisateur +100 Exception NO_DATA_FOUND negative number Autre code d’erreur Oracle Server
  • 16. Les Bases PL/SQL 8-16 8-16 Mostafa Hanoune 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; exempleexemple SQLCODE SQLERRM Fonctions d’interception des Erreurs Lorsqu’une exception est interceptée par la clause WHEN OTHERS, vous pouvez utiliser un ensemble de fonctions standards pour identifier l’erreur. L’exemple de la diapositive montre comment les valeurs de SQLCODE et SQLERRM peuvent être assignées dans des variables et celles-ci utilisées dans des instructions SQL. Il faut tronquer la valeur de SQLERRM à une certaine longueur avant d’essayer de l’écrire dans une variable. Note au formateur N’utilisez pas directement, dans une instruction SQL, les fonctions se rapportant aux erreurs. Assignez d’abord leurs valeurs dans une variable. Vous pouvez transmettre un code erreur à SQLERRM pour renvoyer le message associé ; par exemple, “SQLERRM(-979)” renvoie “ORA-0979: not a GROUP BY expression.” ces fonctions peuvent être utilisées comme de véritables paramètres — par exemple “erreur_procedure(SQLERRM).”
  • 17. Les Bases PL/SQL 8-17 Propagation des exceptions Au lieu d’intercepter une exception dans un bloc PL/SQL, vous pouvez propager l’exception afin de permettre à l’environnement appelant de la traiter. Chaque environnement a sa propre façon d’accéder et d’afficher les erreurs. 8-17 Mostafa Hanoune 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
  • 18. Les Bases PL/SQL 8-18 Propagation d’une exception à partir d’un sous-bloc Lorsqu’un sous-bloc traite une exception, il se termine normalement,et l’exécution du traitement se poursuit dans le bloc supérieur, juste après l’instruction END du sous-bloc. Cependant, si un programme PL/SQL produit une exception et que le bloc ne prévoit pas de la traiter, elle se propage successivement dans les blocs supérieurs jusqu’à trouver une fonction qui la gère. Si aucun de ces blocs ne traite l’exception, le résultat donne une exception de non gérée dans l’environnement hôte. Lorsque l’exception se propage à un bloc supérieur, les actions exécutables restantes de ce bloc sont ignorées. Un des avantages de ce comportement est que vous pouvez ainsi inclure des instructions nécessitant leurs propres fonctions de traitement spécifiques dans leur propre bloc, tout en laissant les exceptions plus générales être traitées dans le bloc de niveau supérieur. Note au formateur (Pour la page 8-19) RAISE_APPLICATION_ERROR ne rentre pas dans le cadre de ce cours car on ne traite pas ici les unités de programme stockées en base. Elles sont abordées dans un autre cours, OPB. La version actuelle de ce dernier cours n’introduit pas la notion de RAISE_APPLICATION_ ERROR , mais suppose que les étudiants y sont familiarisés. Comme le cours développé ici est un prérequis obligatoire à OPB, une introduction aux RAISE_APPLICATION_ ERROR est fournie avec cette version. 8-18 Mostafa Hanoune 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 sousDes sous--blocsblocs peuvent traiter unepeuvent traiter une exception ou laexception ou la transmettretransmettre àà un blocun bloc de niveau supde niveau supéérieur.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;
  • 19. Les Bases PL/SQL 8-19 8-19 Mostafa Hanoune Procédure RAISE_APPLICATION_ERROR SyntaxeSyntaxe • 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}]); Utilisez la procédure RAISE_APPLICATION_ERROR pour renvoyer, une exception pré-définie, en utilisant un code d’erreur non standard et un message d’erreur. Avec RAISE_APPLICATION_ERROR, vous pouvez reporter des erreurs dans votre application et éviter ainsi de renvoyer des exceptions non gérées. Syntaxe : error_number est un code erreur pour l’exception, spécifié par l’utilisateur, compris entre –20000 et –20999. message est le message défini par l’utilisateur pour l’exception. C’est une chaîne de caractères de taille pouvant aller jusqu’à 2 048 bytes. TRUE | FALSE est un paramètre Booléen optionnel (Si TRUE, l’erreur est rangée dans la pile des erreurs précédentes. Si FALSE , valeur par défaut l’erreur remplace toutes les erreurs précédentes.) Exemple ... EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20201, 'Le manager n’’est pas un employé valide.'); END;
  • 20. Les Bases PL/SQL 8-20 8-20 Mostafa Hanoune 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 Exemple ... DELETE FROM emp WHERE mgr = v_mgr; IF SQL%NOTFOUND THEN RAISE_APPLICATION_error(-20202,'Ce n’’est pas un manager Valide'); END IF; ...
  • 21. Les Bases PL/SQL 8-21 8-21 Mostafa Hanoune 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.
  • 22. Les Bases PL/SQL 8-22 8-22 Mostafa Hanoune Présentation de l’exercice • Traiter des exceptions nommées • Créer et faire référence à des exceptions définies par l’utilisateur Aperçu de l’exercice Dans cet exercice, vous devez créer des fonctions de traitement d’exceptions pour des situations particulières.
  • 23. Les Bases PL/SQL 8-23 Exercice 8 1. Ecrire un bloc PL/SQL permettant de sélectionner le nom d’un employé en connaissant le montant de son salaire. a. Si le salaire entré, renvoie plus d’une ligne, traiter l’exception avec une fonction appropriée et insérer dans la table MESSAGES le message suivant : “Plus d’un employé avec le salaire : <salaire>.” b. Si le salaire entré ne renvoie aucune ligne, traiter l’exception avec une fonction appropriée et insérer dans la table MESSAGES le message suivant : “Pas d’employé avec ce salaire : <salaire>.” c. Si le salaire entré ne renvoie qu’une ligne, insérer dans la table MESSAGES le nom de l’employé et le montant de son salaire. d. Traiter toute autre exception avec une fonction appropriée et insérer dans la table MESSAGES le message “Autre erreur.” e. Tester le programme. RESULTS -------------------------------------------- SMITH - 800 Plus d’un employé avec le salaire : 3000 Pas d’employé avec le salaire : 6000 2. Modifier p3q3.sql pour ajouter une fonction de traitement des exceptions. a. Ecrire une fonction de traitement des exceptions pour transmettre un message à l’utilisateur indiquant que le département n’existe pas. b. Exécuter le programme PL/SQL en entrant un département qui n’existe pas. Entrer le numéro de département : 50 Entrer la localité du département :HOUSTON PL/SQL procedure successfully completed. G_MESSAGE -------------------------------------- Le départment 50 n’existe pas 3. Ecrire un programme PL/SQL qui affiche le nombre d’employés qui gagnent 100 $ de plus ou de moins que le montant du salaire donné. a. S’il n’y a pas d’employés dans cette tranche de salaires, afficher un message à l’utilisateur en utilisant une exception. b. S’il y a au moins un employé dans cette tranche de salaires, le message doit indiquer combien d’employés sont dans cette tranche. c. Traiter toute autre exception avec une fonction appropriée. Le message doit indiquer qu’une autre erreur est survenue.
  • 24. Les Bases PL/SQL 8-24 Exercice 8 (suite) Entrer le salaire : 800 PL/SQL procedure successfully completed. G_MESSAGE ---------------------------------------------------------- Il y a 1 employé(s) avec un salaire entre 700 et 900 Entrer le salaire : 3000 PL/SQL procedure successfully completed. G_MESSAGE ---------------------------------------------------------- Il y a 3 employé(s) avec un salaire entre 2900 et 3100 Entrer le salaire : 6000 PL/SQL procedure successfully completed. G_MESSAGE ---------------------------------------------------------- Il n’y a pas d’employé avec un salaire entre 5900 et 6100