Cours 5 Gestion Des Exceptions - Les Sous Programmes

Vous aimerez peut-être aussi

Vous êtes sur la page 1sur 25

Cours 3 : Gestion des exceptions

1
Manipulation des exceptions en
PL/SQL
 Une erreur, provoque l’échec du bloc PL/SQL

 Pour se protéger contre ces situations, il est possible de


gérer ces exceptions:
◦ La gestion d’une exception consiste à prévoir un traitement
approprié qui absorbe ou résout l’erreur.

L’endroit de ce traitement est la section EXCEPTION

2
 En cas d’une erreur rencontrée dans la section exécutable
d’un bloc, le contrôle passe immédiatement à la section
EXCEPTION du même bloc :

DECLARE

BEGIN

Erreur
...
...
EXECPTION

END; 3
Syntaxe :

EXCEPTION
WHEN exception1 THEN
énoncé1;
énoncé2;
…….
[WHEN exception2 [OR exception3 …] THEN
énoncé3;
énoncé4;
…….]

[WHEN OTHERS THEN


énoncé5;
énoncé6;
…….]

4
Exemple
DECLARE
V_nom Chercheur.Cnom%TYPE;
BEGIN
SELECT nom
INTO V_nom
FROM Chercheur

DBMS_OUTPUT.PUT_LINE (‘Nom Chercheur : ’|| V_nom);
Exception
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (‘Plusieurs chercheurs Trouvés.’);

END;
5
Exceptions prédéfinies (dans ORACLE)

◦ Elles sont prédéfinies par Oracle


◦ Elles possèdent des noms significatifs
◦ Elles sont automatiquement provoquées

◦ Les exceptions les plus courantes sont les suivantes :


 Exception NO_DATA_FOUND (ORA-01403)
 Exception TOO_MANY_ROWS (ORA-01422)
 Exception DUP_VAL_ON_INDEX (ORA-00001)
 Exception VALUE_ERROR (ORA-06502)
 Exception ZERO_DIVIDE (ORA-01476)
 Exception INVALID_CURSOR (ORA-01722)

6
 Exception TOO_MANY_ROWS (ORA-01422)

◦ Condition de provocation : lorsqu'un curseur implicite


d’interrogation identifie plus d’une seule ligne à retourner

◦ Exemple : plusieurs étudiants ayant la même filière

DECLARE
V_NomETUD ETUDIANT.NomETUD%TYPE;
BEGIN
SELECT NomETUD
INTO V_NomETUD
FROM ETUDIANT WHERE filière = ‘Informatique’;
EXECPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (‘Plusieurs étudiants trouvés.’);

END;

7
 Exception NO_DATA_FOUND (ORA-01403)

◦ Condition de provocation : lorsqu'un curseur implicite d’interrogation ne


retourne aucune ligne

◦ Exemple : cas de recherche d’un étudiant inexistant

DECLARE
ETUDIANT_REC ETUDIANT%ROWTYPE;

BEGIN
SELECT * INTO ETUDIANT_REC
FROM ETUDIANT WHERE NumETUD= -1;
EXECPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE (‘Etudiant Inexistant’);

END;

◦ Remarque : L’absence d’un gestionnaire pour l’exception


NO_DATA_FOUND entraîne une sortie du bloc avec échec

8
 Exception DUP_VAL_ON_INDEX (ORA-00001)
◦ Condition de provocation : lorsqu’une commande SQL tente d’insérer
une valeur dupliquée dans une colonne définie avec un PRIMARY KEY

◦ Exemple : cas d’insertion avec duplication de clé primaire

BEGIN
INSERT INTO Etudiant (NumETUD, …)
VALUES (10, ‘Dupont’, ‘Informatique’);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE (‘Insertion rejetée :NumETUD existe déjà.’);
END;

9
 Exception VALUE_ERROR (ORA-06502)
◦ Condition de provocation : en cas de troncature ou d’erreur de
conversion

◦ Exemple : Affectation générant une troncature

DECLARE
V_message VARCHAR2 (10);
BEGIN
V_message :=‘Chaîne trop longue’;
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE (‘Erreur de troncature’);
END;

1
0
 Exception ZERO_DIVIDE (ORA-01476)
◦ Condition de provocation : tentative de division par ZERO

◦ Exemple

DECLARE
V_nombre1 int :=10;
V_nombre2 int :=5;
V_resultat number (5,3);
BEGIN
V_resultat := 100/(V_nombre1 -2* V_nombre2);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE (‘Exception ZERO_DIVIDE’);
END;

1
1
 Exception INVALID_CURSOR (ORA-01722)
◦ Condition de provocation : au moment ou un curseur fermé
est référencé dans une opération de lecture (FETCH), de
fermeture (CLOSE) ou via des attributs (%FOUND,
%NOTFOUND, %ROWCOUNT)

 Exceptions génériques OTHERS


—Condition de provocation : toute exception non gérée
—WHEN OTHERS doit être la dernière

1
2
 PL/SQL permet à l'utilisateur de définir ses propres exceptions.
 La gestion des anomalies utilisateur peut se faire dans un bloc
PL/SQL en effectuant les opérations suivantes :
1. Sont définies dans la section DECLARE
2. Sont déclenchées explicitement dans la section BEGIN par
l'instruction RAISE
3. Dans la section EXCEPTION, référencer le nom défini dans la
section DECLARE.

13
14
15
 Cours 4 : Les sous-programmes

16
16
 PL/SQL offre la possibilité de travailler avec des blocs
nommés (sous programmes).
 Les sous programmes se présentent sous formes de
procédures et de fonctions.
 PL/SQL fait distinction entre les fonctions

et les procédures.

17
 PL/SQL offre trois modes de passage de paramètres valables
pour les deux types de sous programmes.

Parami suit la syntaxe : Nom_du_Paramètre [IN | OUT | IN OUT]


Type [{ := |DEFAULT} valeur};
Où :
IN : Paramètre d’entrée/ Passage par valeur.
OUT : Paramètre de sortie/ Passage par @ pour retourner un résultat
IN OUT : Paramètre d’entrée/Sortie/ Passage par @.

Par défaut le paramètre est IN.

18
 Un sous programme déclaré dans un bloc est temporaire à ce
bloc . Il n’est plus disponible pour être appelé lorsque
l’exécution du bloc se termine.

19
 Syntaxe
PROCEDURE nom_proc [(paramètre…)] {IS|AS}
{Déclarations variables locales}
BEGIN
Section exécutable
[EXCEPTION]
END [nom_proc] ;

20
Set serveroutput on ;
DECLARE
PROCEDURE Enregistrer_Trace AS
BEGIN
INSERT INTO TAB_TRACE (user_uid, user_name, log_date)
VALUES (UID, USER, SYSDATE);
END Enregistrer_Trace;
--autres déclarations
BEGIN –-début bloc externe
Enregistrer_Trace; --appel procédure
--suite traitement
END; --fin bloc externe

21
Set serveroutput on ;
DECLARE
PROCEDURE Augmenter_SAL (P_EMPNO EMP.EMPNO%TYPE, P_MONT NUMBER) IS
V_EMPNO EMP.EMPNO%TYPE;
BEGIN
UPDATE EMP
SET SAL = SAL + P_MONT
WHERE EMPNO := P_EMPNO;
IF SQL% NOTFOUND THEN
dbms_output.put_line(‘MAJ non effectuée’);
ELSE
dbms_output.put_line(‘MAJ effectuée’);
END IF;
END Augmenter_SAL;
--autres déclarations
BEGIN –-début bloc externe
Augmenter_SAL (7368, 100); --appel procédure
--suite traitement
END; --fin bloc externe

22
• Comme tout objet manipulé par Oracle, les
procédures stockées peuvent être supprimées si
nécessaire.
• Cette suppression est assurée par la commande
suivante :
DROP PROCEDURE nom_procédure;

23
23
 Une fonction est un sous programme qui retourne une valeur
explicitement par la clause Return.
FUNCTION nom_fonction [(paramètre…)]
RETURN type IS
{Déclarations variables locales}
BEGIN
Section exécutable
RETURN expression;
[EXCEPTION]
END [nom_fonction] ;

 Si aucune instruction RETURN n’est rencontrée, l’exception


PROGRAM_ERROR est levée.

24
Set serveroutput on ;
DECLARE
V_sal_Moy NUMBER (10,3);
FUNCTION AVG_SAL (P_deptno IN EMP.DEPTNO%TYPE)
RETURN NUMBER IS
V_AVG_SAL EMP.SAL%TYPE;
BEGIN
SELECT AVG(SAL)
INTO V_AVG_SAL
FROM EMP
WHERE DEPTNO = P_deptno;
RETURN (V_AVG_SAL);
END AVG_SAL;
BEGIN
V_sal_Moy := AVG_SAL(10);
dbms_output.put_line(‘Salaire moyenne’|| V_sal_Moy);
END;
25

Vous aimerez peut-être aussi