24
8 8 Mostafa Hanoune Traitement des Exceptions

Cours08 exceptions

Embed Size (px)

Citation preview

Page 1: Cours08 exceptions

88

Mostafa Hanoune

Traitement des Exceptions

Page 2: Cours08 exceptions

Les Bases PL/SQL 8-2

ObjectifsDans 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

ObjectifsA 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

Page 3: Cours08 exceptions

Les Bases PL/SQL 8-3

PrésentationUne 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

Page 4: Cours08 exceptions

Les Bases PL/SQL 8-4

Interception d’une ExceptionSi 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 ExceptionSi 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;

Exception Exception éémisemise

EXCEPTIONEXCEPTION

Exception Exception interceptinterceptééee

Propager lPropager l’’exceptionexception

DECLAREDECLARE

BEGINBEGIN

END;END;

Exception Exception éémisemiseEXCEPTIONEXCEPTION

Exception non Exception non interceptinterceptééee

Exception propagException propagéée e ààll’’environnement appelantenvironnement appelant

Page 5: Cours08 exceptions

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éées es implicitementimplicitement

DDééclenchclenchéées es explicitementexplicitement

Types d’ExceptionsVous 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 traitementErreur prédéfinie duserveur Oracle

Une des 20 erreurs qui arriventle plus fréquemment en langagePL/SQL

Ne pas la déclarer et laisserOracle Server l’émettreimplicitement

Erreur non prédéfiniedu serveur Oracle

Toute autre erreur standardd’Oracle Server

La déclarer à l’intérieur dusegment de déclaration et laisserOracle Server l’émettreimplicitement

Erreur définie parl’utilisateur

Une condition que leprogrammeur définit commeanormale

La déclarer à l’intérieur dusegment de déclaration etdéclencher son émissionexplicitement

Page 6: Cours08 exceptions

Les Bases PL/SQL 8-6

8-6

Mostafa Hanoune

Intercepter les Exceptions

EXCEPTIONWHEN exception1 [OR exception2 . . .] THENinstruction1;instruction2;. . .

[WHEN exception3 [OR exception4 . . .] THENinstruction1;instruction2;. . .]

[WHEN OTHERS THENinstruction1;instruction2;. . .]

SyntaxeSyntaxe

Interception d’ExceptionsVous 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/SQLOTHERS Clause de traitement d’Exception Optionnelle, qui intercepte toutes les

exceptions non gérées dans la même section d’exception.

Exception WHEN OTHERSLa 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.

Page 7: Cours08 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.

Page 8: Cours08 exceptions

Les Bases PL/SQL 8-8

Interception des erreurs Oracle pré-définiesIntercepter 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

Page 9: Cours08 exceptions

Les Bases PL/SQL 8-9

Exceptions pré-définies

Nom de l’ExceptionCode

ErreurOracleServer

Description

ACCESS_INTO_NULL ORA-06530 Assignation d’une valeur à un objet noninitialisé

COLLECTION_IS_NULL ORA-06531 Utilisation d’une méthode autre que EXISTSsur une nested table non initialisée ou un varray

CURSOR_ALREADY_OPEN ORA-06511 Ouverture d’un curseur déjà ouvertDUP_VAL_ON_INDEX ORA-00001 Insertion d’une ligne en doublonINVALID_CURSOR ORA-01001 Opération interdite sur un curseurINVALID_NUMBER ORA-01722 Echec sur une conversion d’une chaîne de

caractères vers du numberLOGIN_DENIED ORA-01017 Connexion à Oracle avec un utilisateur ou un

mot de passe invalideNO_DATA_FOUND ORA-01403 SELECT mono-ligne retournant 0 ligneNOT_LOGGED_ON ORA-01012 Echec d’un appel DB dans un programme

PL/SQL car l’utilisateur n’est pas connectéPROGRAM_ERROR ORA-06501 Le PL/SQL a un problème interneROWTYPE_MISMATCH ORA-06504 Incompatibilité de type entre une variable Hôte

et une variable PL/SQL suite à une affectationSTORAGE_ERROR ORA-06500 Dépassement de capacité mémoire ou mémoire

corrompueSUBSCRIPT_BEYOND_COUNT ORA-06533 Référence d’un élément d’une nested table ou

varray en utilisant un indice plus grand que lenombre d’éléments dans la collection

SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Référence d’un élément d’une nested table ouvarray en utilisant un indice qui sort dudomaine autorisé (-1 par exemple)

TIMEOUT_ON_RESOURCE ORA-00051 Dépassement d’un timeout pour allocationd’une ressource par Oracle

TOO_MANY_ROWS ORA-01422 SELECT mono-ligne retournant plus d’1 ligneVALUE_ERROR ORA-06502 Erreur d’arithmétique, de conversion, de

troncature, ou de limite de tailleZERO_DIVIDE ORA-01476 Division par zéro

Page 10: Cours08 exceptions

Les Bases PL/SQL 8-10

Interception d’exceptions Oracle Server pré-définiesUne seule exception à la fois est déclenchée et traitée.

8-10

Mostafa Hanoune

Exception pré-définie

BEGIN SELECT ... COMMIT;EXCEPTIONWHEN NO_DATA_FOUND THENinstruction1; instruction2;

WHEN TOO_MANY_ROWS THENinstruction1;

WHEN OTHERS THENinstruction1; instruction2; instruction3;

END;

SyntaxeSyntaxe

Page 11: Cours08 exceptions

Les Bases PL/SQL 8-11

Interception d’erreurs Oracle non pré-définiesVous 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 pragmaEXCEPTION_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

•• Nommer Nommer ll’’exceptionexception

AssocierAssocier

•• Coder le PRAGMA Coder le PRAGMA EXCEPTION_INITEXCEPTION_INIT

Section DECLARESection DECLARE

TraiterTraiter

•• Traiter Traiter ll’’exception exception ddééclenchclenchééee

SectionSectionEXCEPTIONEXCEPTION

Page 12: Cours08 exceptions

Les Bases PL/SQL 8-12

8-12

Mostafa Hanoune

DECLARE

v_deptno dept.deptno%TYPE := &p_deptno;BEGINDELETE FROM deptWHERE deptno = v_deptno;COMMIT;

EXCEPTIONWHEN THENDBMS_OUTPUT.PUT_LINE('Suppression Impossible dudep:'||TO_CHAR(v_deptno)||'Employés existant ');

END;

Erreurs Oracle non pré-définiesIntercepter une erreur de violation de Intercepter une erreur de violation de contraintes (Erreur Oracle contraintes (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éfinie1. 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. ExempleS’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);

Page 13: Cours08 exceptions

Les Bases PL/SQL 8-13

Interception d’exceptions définies par l’utilisateurLe 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

•• Nommer Nommer ll’’exceptionexception

DDééclarerclarer

Section Section DECLAREDECLARE

DDééclencherclencher

•• DDééclencher clencher explicitement explicitement ll’’exception avec exception avec RAISERAISE

Section Section EXECUTABLEEXECUTABLE

Traiter Traiter

•• Traiter Traiter ll’’exception exception declenchdeclenchééee

Section Section EXCEPTIONEXCEPTION

Page 14: Cours08 exceptions

Les Bases PL/SQL 8-14

8-14

Mostafa Hanoune

Exceptions définies par l’utilisateur

DECLARE

BEGINUPDATE productSET descrip = '&product_description'WHERE prodid = &product_number;IF SQL%NOTFOUND THEN

END IF;COMMIT;

EXCEPTIONWHEN THENDBMS_OUTPUT.PUT_LINE('Numéro de produit invalide.');END;

exempleexemplee_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’exception2. Utiliser l’instruction RAISE pour déclencher explicitement l’exception dans la section

EXECUTABLE.Syntaxe

où : exception est l’exception préalablement déclarée3. Traiter l’exception ainsi déclarée dans la section EXCEPTION.

ExempleCe 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;

Page 15: Cours08 exceptions

Les Bases PL/SQL 8-15

Fonctions d’interception des ErreursLorsqu’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

• SQLCODERenvoie la valeur numérique associé au code de l’erreur

• SQLERRMRenvoie le message associé au code de l’erreur

Fonction DescriptionSQLCODE 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 Description0 Pas d’exception enregistrée1 Exception définie par l’utilisateur+100 Exception NO_DATA_FOUNDnegative number Autre code d’erreur Oracle Server

Page 16: Cours08 exceptions

Les Bases PL/SQL 8-16

8-16

Mostafa Hanoune

Fonctions d’interception des Erreurs

DECLAREv_error_code NUMBER;v_error_message VARCHAR2(255);

BEGIN...EXCEPTION...WHEN OTHERS THENROLLBACK;v_error_code := SQLCODE ;v_error_message := SQLERRM ;

INSERT INTO erreurs VALUES(v_error_code,v_error_message);

END;

exempleexemple

SQLCODESQLERRM

Fonctions d’interception des ErreursLorsqu’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 formateurN’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).”

Page 17: Cours08 exceptions

Les Bases PL/SQL 8-17

Propagation des exceptionsAu 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 appelantsSQL*Plus

ProcedureBuilder

OracleDeveloperFormsUne 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

Page 18: Cours08 exceptions

Les Bases PL/SQL 8-18

Propagation d’une exception à partir d’un sous-blocLorsqu’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

BEGINSELECT ...UPDATE ...IF SQL%NOTFOUND THEN

RAISE e_no_rows;END IF;

EXCEPTIONWHEN e_integrity THEN ...WHEN e_no_rows THEN ...

END;

DECLARE. . .e_no_rows exception;e_integrity exception;PRAGMA EXCEPTION_INIT (e_integrity, -2292);

BEGINFOR c_record IN emp_cursor LOOP

END LOOP;EXCEPTION

WHEN NO_DATA_FOUND THEN . . .WHEN TOO_MANY_ROWS THEN . . .

END;

Des sousDes sous--blocs blocs peuvent traiter une peuvent traiter une exception ou la exception ou la transmettre transmettre àà un bloc un bloc de niveau supde niveau supéérieur.rieur.

BEGINSELECT ...UPDATE ...IF SQL%NOTFOUND THEN

RAISE e_no_rows;END IF;

EXCEPTIONWHEN e_integrity THEN ...WHEN e_no_rows THEN ...

END;

Page 19: Cours08 exceptions

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 THENRAISE_APPLICATION_ERROR (-20201,

'Le manager n’’est pas un employé valide.');END;

Page 20: Cours08 exceptions

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 empWHERE mgr = v_mgr;IF SQL%NOTFOUND THENRAISE_APPLICATION_error(-20202,'Ce n’’est pas un manager Valide');END IF;...

Page 21: Cours08 exceptions

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.

Page 22: Cours08 exceptions

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’exerciceDans cet exercice, vous devez créer des fonctions de traitement d’exceptions pour des situations particulières.

Page 23: Cours08 exceptions

Les Bases PL/SQL 8-23

Exercice 81. 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 - 800Plus d’un employé avec le salaire : 3000Pas 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 : 50Entrer 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.

Page 24: Cours08 exceptions

Les Bases PL/SQL 8-24

Exercice 8 (suite)

Entrer le salaire : 800PL/SQL procedure successfully completed.

G_MESSAGE----------------------------------------------------------Il y a 1 employé(s) avec un salaire entre 700 et 900

Entrer le salaire : 3000PL/SQL procedure successfully completed.

G_MESSAGE

----------------------------------------------------------

Il y a 3 employé(s) avec un salaire entre 2900 et 3100

Entrer le salaire : 6000PL/SQL procedure successfully completed.

G_MESSAGE----------------------------------------------------------Il n’y a pas d’employé avec un salaire entre 5900 et 6100