You are on page 1of 35

La Gestion des exceptions

Narjess Touzani-Chebaane
2017/2018
Introduction
[ DECLARE ]

……

BEGIN

……..

[ EXCEPTION

--Traitement des erreurs à l’exécution ]

END;

/ 2
Gestion des exceptions

Deux types d’exception:


Implicites ou standards à PL/SQL : prédéfinies
par ORACLE,

Explicites : définies par les utilisateurs.

3
Gestion des erreurs standards
SQLCODE : Renvoie le statut d’erreur de la
dernière instruction exécutée. Si l’instruction a
été exécutée sans erreur, sa valeur est à zéro.

SQLERRM : fonction qui renvoie le message


d’erreur correspondant à la valeur de SQLCODE.

4
Quelques erreurs standards

Nom Erreur Signification

NO_DATA_FOUND L’élément accédé n’existe pas


DUP_VAL_ON_INDEX L’enregistrement existe déjà
INVALID_CURSOR Curseur invalide
INVALID_NUMBER Nombre invalide
LOGIN_DENIED Accès interdit, Username et password
invalides
TOO_MANY_ROWS Un ordre SELECT INTO ramène plusieurs
tuples dans des variables simples
ZERO_DIVIDE Division d’un nombre par zéro

5
Description de traitement de l’erreur
BEGIN
….
EXCEPTION
WHEN NomErreur1 THEN
TraitementErreur1 ;
…..
[WHEN NomErreur_i [OR NomErreur_j] THEN
TraitementErreurN ;

WHEN OTHERS THEN


Traitement_Commun_Au_Autres_Erreurs ;]
END;
/
Exemple1 : Ajouter un nouveau produit dans la table, dont les
informations sont données par l’utilisateur. 6
Gestion des erreurs explicites
Déclaration de l’erreur
DECLARE
NomException EXCEPTION ;
Traitement de l’erreur
Même chose que pour les erreurs standards
Déclenchement de l’erreur
RAISE NomException ;

7
Exemple 2
Insertion d’une nouvelle ligne dans la table Livraison, dont
les informations correspondantes sont données par
l’utilisateur. Traiter les éventuelles erreurs standards qui
peuvent survenir, ainsi que les cas où :

La quantité donnée est supérieure à la quantité en stock

La remise est négative

8
PROCEDURES, FONCTIONS
STOCKEES ET PACKAGES
LES PROCEDURES : Création

CREATE [OR REPLACE] PROCEDURE NomProcédure


[(paramètre_formel1[mode] type [, paramètre_formel2[mode] type ] …) ]
[IS | AS]
[déclaration_des_variables_locales]
BEGIN - IN: paramètre en entrée, non modifié
….. par la procédure
- OUT: paramètre en sortie, peut être
[EXCEPTION]
modifié par la procédure,
…. - IN OUT: a la fois en entrée et en sortie
END; - Par défaut : IN
10
Exemples

CREATE TABLE T (num1 INTEGER, num2 INTEGER) ;


CREATE OR REPLACE PROCEDURE essai(x IN NUMBER, y
OUT NUMBER, z IN OUT NUMBER)
AS
BEGIN
Y := x*z;
Z := z * z;
INSERT INTO T VALUES(x,z);
END;
/
Ecrire une procédure «InfoFournisseur » permettant de récupérer le
11
nom d’un fournisseur dont le numéro est passé en paramètre
Exemples
Appel de la procédure InfoFournisseur à partir
d’SQL*PLUS :

SQL> VAR g_nom varchar2(15)


SQL> EXECUTE InfoFournisseur (36, :g_nom)
SQL> PRINT g_nom

12
Exemples
Appel de la procédure InfoFournisseur à partir d’un
bloc PL/SQL :

DECLARE
Vnom Fournisseur.NomF%TYPE ;
BEGIN
...
InfoFournisseur (12, Vnom);
END;
/
13
LES PROCEDURES : Suppression

DROP PROCEDURE Nom_Procédure ;

14
LES FONCTIONS : Création
CREATE [OR REPLACE] FUNCTION NomFonction
[(argument [IN] type [, argument [IN] type ] …) ]
RETURN type_retour
[IS | AS]
[déclaration_des_variables_locales]
BEGIN
définit le mode du paramètre
….. formel, qui est obligatoirement
[EXCEPTION] en entrée (IN)
….
RETURN (variable_résultat);
END; 15
Fonctions
Exemple
Ecrire une fonction « Calcul_liv » qui calcule le montant total
des livraisons d’une usine dont le nom est transmis en
paramètre.
Appel
Appel de Calcul_liv en mode interactif:
SQL> VAR montLiv NUMBER
SQL> EXECUTE :montLiv : =Calcul_liv (‘Delta’)
SQL> PRINT montLiv
Soit à partir d’un bloc PL/SQL en indiquant le nom de la
16
fonction suivi éventuellement des paramètres effectifs.
LES FONCTIONS : Suppression

DROP FUNCTION Nom_Fonction ;

17
LES PACKAGES : Introduction
Un package permet de définir et de stocker des
modules logiques de traitement dans une base
de données en regroupant des :
• procédures
• fonctions
• variables
• constantes
• curseurs
• traitements d’exception
qui ont un lien logique avec eux, sous une seule
entité. 18
LES PACKAGES
Un package est organisé en deux parties distinctes :
Partie spécification : permet de spécifier à la fois
des fonctions et des procédures publiques ainsi
que les déclarations des types, des variables, des
constantes, exceptions et curseur utilisés dans le
package et visibles de l’extérieur ;
Partie corps : contient les blocs et les
spécifications. Elle peut inclure des objets qui ne
sont pas listés dans la partie spécification et sont
privés.
Chaque partie du package doit être créée et 19

compilée séparément.
LES PACKAGES : création de la
partie « spécifications »
CREATE [OR REPLACE] PACKAGE NomPackage
[IS | AS]
{ [déclaration_de_procédures ; ]
| [déclaration_de_fonctions ; ]
| [déclaration_de_variables ; ]
| [déclaration_de_curseur ; ]
| [déclaration_des_exceptions ; ] …}
END NomPackage ;

20
PACKAGES : création de la partie «
corps ou body »
CREATE [OR REPLACE] PACKAGE BODY NomPackage
[IS | AS]
{ [déclaration_de_variables ; ]
| [Définition_fonctions ; ]
| [Définition_de_procédures ; ]
| [déclaration_de_curseur ; ]
| [déclaration_des_exceptions ; ] …}
END NomPackage ;

21
Exemple

Créer la spécification d’un package rassemblant


les éléments suivants :
une procédure permettant de supprimer une
usine de numéro connu,
Une fonction qui calcule le nombre de produits
fabriqués par un fabriquant donné, et
Une procédure qui vérifie la validité du prix
unitaire d’un produit en utilisant une exception.
Cette exception affiche un message d’erreur si
le prix unitaire est négatif. 22
Portée et visibilité des variables,
fonctions et procédures
PORTEE UTILISATION DECLARATION
DEFINITION

Publique Dans tous les Déclaré dans spécification


environnements oracle Défini dans partie Body

Privé Peut seulement être Déclaré et défini


référencé par des uniquement
éléments du package dans partie Body

VISIBILITE

Locale Définie à l’intérieur d’un sous-programme


Pas de référence en dehors du sous-programme

Globale Peut être référencée et changée en dehors du sous-programme


23
Portée et visibilité des variables,
fonctions et procédures
Variable 1 VARIABLE PUBLIQUE
SPECIFICATIONS
DECLARATION
PROCEDURE A PROCEDURE PUBLIQUE

Variable 2 VARIABLE GLOBALE

DEFINITION PROCEDURE PRIVEE


PACKAGE PROCEDURE B
BODY
PROCEDURE PUBLIQUE
DEFINITION
PROCEDURE A
Variable 3 VARIABLE LOCALE A LA
PROCEDURE A 24
Référence à un objet d’un package
L’accès à un objet d’un package se fait selon la syntaxe
suivante :
En mode interactif :
EXECUTE NomPackage.NomProcedure
(liste_paramètres) | NomFonction (liste_ paramètres) |
variable_globale ;
A partir d’un bloc PL/SQL
NomPackage.NomProcedure (liste_paramètres) |
NomFonction (liste_ paramètres)

25
Modification d’un package

Modification de la partie spécification:

REPLACE PACKAGE NomPackage ;

Modification de la partie corps:

REPLACE PACKAGE BODY NomPackage ;

26
Suppression d’un package

Suppression d’un package entier:


DROP PACKAGE NomPackage ;

Suppression de la partie corps d’un package:


DROP PACKAGE BODY NomPackage ;

27
LES DECLENCHEURS
Introduction

Déclencheurs ou ”triggers” : séquences


d’actions définis par le programmeur
Se déclenchent quand un événement
particulier sur une tables se produit.
Objet stocké.
Il peut être actif ou inactif.

29
Syntaxe

CREATE [OR REPLACE] TRIGGER NomTrigger


{BEFORE|AFTER} {INSERT|DELETE|UPDATE}
ON NomTable
[FOR EACH ROW [WHEN (Condition)]]
[DECLARE
… ]
BEGIN
CorpsTrigger ;
END ; 30
Exemples
CREATE TABLE T1 CREATE TABLE T2
(num3 INTEGER,
(num1 INTEGER,
num4 INTEGER);
num2 INTEGER);

Créer un trigger qui, en cas d’insertion d’un tuple dans T1


dont la première coordonnée est inférieure à 3, insére le
tuple inverse dans T2.

31
Tables en mutation
Il est impossible, dans un trigger de type FOR
EACH ROW de faire un SELECT sur la table en
cours de modification.
CREATE OR REPLACE TRIGGER trig_Exemple1
BEFORE UPDATE ON Produit
DECLARE
NB NUMBER;
BEGIN
SELECT COUNT(*) INTO NB
FROM Produit;
END;
/
SQL> UPDATE Produit SET Couleur = ‘Vert’; Mise à jour effectuée
32
Tables en mutation
CREATE OR REPLACE TRIGGER trig_Exemple2
BEFORE UPDATE ON Produit
FOR EACH ROW
DECLARE
NB NUMBER;
BEGIN
SELECT COUNT(*) INTO NB
FROM Produit;
END;
/
Mise à jour non effectuée
UPDATE Produit SET Couleur = ‘Bleu’;
Erreur: table en mutation

33
Exemples
Créer un trigger qui permet, à chaque mise à jour (ajout,
suppression ou modification) sur la table Fournisseur,
d’afficher le type de la mise à jour effectuée.
Créer un trigger qui permet, pour chaque modification ou
suppression dans la table usine, de garder dans une
table ‘ancienne_usine’ (qu’on suppose déjà créée) un
historique des lignes manipulées.
Créer un trigger qui permet de vérifier pour chaque
insertion d’une nouvelle livraison que la quantité en
stock du produit en question est suffisante pour faire la
livraison. Dans le cas contraire, afficher un message
d’erreur. 34
Activation/désactivation d’un trigger
ALTER TRIGGER NomTrigger
{ENABLE|DISABLE};

Suppression d’un trigger


DROP TRIGGER NomTrigger

35

You might also like