Vous êtes sur la page 1sur 32

Base de Données

Avancées: PL/SQL

Pr. Abderrahmane ELBALAOUI


Email : elbalaoui@gmail.com

Année Universitaire 2023/2024


Plan
• Partie II :
– Chapitre 1 : Introduction et Structure de base PL/SQL

– Chapitre 2 : les curseurs et la gestion des exceptions


– Chapitre 3 : Programmes stockés (Procédures,
Fonctions)
– Chapitre 4 : Packages et Déclencheurs (triggers).

2
2
Chapitre 4 : Packages et Déclencheurs
(triggers).

I. II. Les packages


1. Définition
2. Structure d’un package
3. Syntaxe de la création de package
4. Structures publiques et privées
5. Utilisation des packages
6. Exemple Pratique
III. Les triggers
1. Définition
2. Composants des déclencheurs
3. Séquence d’exécution
4. Créer des déclencheurs
5. Gérer les déclencheurs
I . PACKAGES

1. Définition

• Les packages sont des objets de base de données qui regroupent


un ensemble de procédures, fonctions, variables, constantes de
curseurs et d’exceptions liés par un même contexte logique.

• Ils offrent une manière organisée et modulaire de stocker et de


gérer du code.

4
4
I . PACKAGES

2. Structure d'un Package :


La structure d'un package comprend deux parties distinctes :

• Spécification :
• Elle définit les éléments du package accessibles à l'extérieur.
• Inclut les déclarations de procédures, fonctions, types de
données personnalisés, constantes, etc.
• Corps :
• Contient l'implémentation réelle des éléments définis dans la
spécification.
• Il contient le code pour chaque procédure ou fonction
déclarée dans la spécification.
• Peut inclure des éléments supplémentaires privés qui ne sont
pas accessibles à l'extérieur du package.

5
5
I . PACKAGES

3. Syntaxe de création de Packages


La création d'un package en Oracle suit une syntaxe spécifique,
séparant la spécification et le corps du package.

-- Spécification du package
CREATE [OR REPLACE] PACKAGE nom_package IS
-- Déclarations (variables, constantes, procédures, fonctions, types)
END;

-- Corps du package
CREATE PACKAGE BODY nom_package IS
-- Implémentation des procédures et fonctions déclarées dans la spécification
END;

6
6
I . PACKAGES
Exemple :
Le package GestionEmployes comprend la définition d’une constante salaire_min,
une procédure embaucher_emp pour l'insertion d'un employé dans une table, et
une fonction calculer_prime qui calcule une prime en fonction du salaire de
l'employé.

• Spécification du package :
-- Spécification du package
CREATE OR REPLACE PACKAGE GestionEmployes AS
-- Déclaration d'une constante
salaire_min CONSTANT NUMBER := 30000;
-- Déclaration d'une procédure
PROCEDURE embaucher_emp(id NUMBER, nom VARCHAR2, salaire NUMBER);
-- Déclaration d'une fonction
FUNCTION calculer_prime(salaire IN NUMBER) RETURN NUMBER;
END GestionEmployes;

7
7
I . PROCEDURE
• Corps du package :
-- Corps du package
CREATE OR REPLACE PACKAGE BODY GestionEmployes AS
-- Implémentation de la procédure d'embauche
PROCEDURE embaucher_emp(id NUMBER, nom VARCHAR2, salaire NUMBER) IS
BEGIN
INSERT INTO Employes (employe_id, employe_nom, employe_salaire)
VALUES (id, nom, salaire);
COMMIT; -- Validation de la transaction
END embaucher_employe;

-- Implémentation de la fonction de calcul de prime


FUNCTION calculer_prime(salaire IN NUMBER) RETURN NUMBER IS
prime NUMBER;
BEGIN
-- Calcul de la prime (exemple simplifié)
IF salaire >= salaire_min THEN
prime := salaire * 0.1;
ELSE
prime := salaire * 0.05;
END IF;
RETURN prime;
END calculer_prime;
8
END GestionEmployes; 8
I . PACKAGES

4. Structures publiques et privées


Structures Publiques :
Les structures publiques sont celles déclarées dans la spécification
du package et sont accessibles à l'extérieur du package. Elles
peuvent être utilisées par d'autres parties du code ou d'autres
packages.

Structures Privées :
Les structures privées sont celles déclarées uniquement dans le
corps du package et ne sont pas accessibles à l'extérieur du
package. Elles ne sont visibles que dans le corps du package lui-
même et ne peuvent pas être utilisées en dehors de celui-ci.

9
9
I . PACKAGES
4. Exemple : Structures publiques et privées
CREATE OR REPLACE PACKAGE GestionVentes AS
-- Structure publique : déclaration d'une fonction
FUNCTION calcul_tva(prix_total NUMBER) RETURN NUMBER;
END GestionVentes;

CREATE OR REPLACE PACKAGE BODY GestionVentes AS


-- Structure privée : déclaration d'une constante
const_taux_tva CONSTANT NUMBER := 0.20;
-- Structure privée : déclaration d'une fonction
FUNCTION appliquer_tva(prix_total NUMBER) RETURN NUMBER IS
BEGIN
-- Calcul de la TVA (exemple simplifié)
RETURN prix_total * const_taux_tva;
END appliquer_tva;

-- Structure publique : implémentation de la fonction


FUNCTION calcul_tva(prix_total IN NUMBER) RETURN NUMBER IS
prix_tva NUMBER;
BEGIN
-- Appel de la fonction privée pour calculer la TVA
prix_tva := appliquer_tva(prix_total);
RETURN prix_tva;
END calcul_tva; 10
10
END GestionVentes;
I . PACKAGES
5. Utilisation des packages
Une fois le package créé et défini, vous pouvez l'utiliser dans d'autres
procédures, fonctions ou scripts en appelant ses procédures ou
fonctions, comme ceci :
Appel dans un Bloc PL/SQL :
Calcul de la TVA pour un montant de vente spécifique :

DECLARE
montant_total NUMBER := 1500;
montant_tva NUMBER;
BEGIN
montant_tva := GestionVentes.calcul_tva(montant_total);
DBMS_OUTPUT.PUT_LINE('Montant de TVA pour ' || montant_total || ' :
' || montant_tva);
END;

Appel dans une Requête SQL :

SELECT GestionVentes.calcul_tva(2000) AS montant_tva FROM DUAL;

11
11
I . PACKAGES
6. Suppression d’une package

Pour supprimer un package dans une base de données, vous


pouvez utiliser une commande :

DROP PACKAGE nom_du_package;

Assurez-vous d'avoir les privilèges nécessaires pour supprimer des


objets de la base de données.

12
12
I . PACKAGES
7. Exemple d’application
Créer un package pour gérer des opérations bancaires, en permettant
d'ajouter des comptes, de consulter le solde d'un compte et
d'effectuer des transactions.
Spécification du package :
• Déclarer une constante représentant le solde initial pour un
nouveau compte.
• Définir une procédure pour créer un nouveau compte.
• Déclarer une fonction pour consulter le solde d'un compte.
• Définir une procédure pour effectuer un dépôt sur un compte.
• Définir une procédure pour effectuer un retrait d'un compte.

13
13
I . PACKAGES
7. Exemple d’application
Spécification du package :

CREATE OR REPLACE PACKAGE GestionComptes AS


-- Structure publique : déclaration d'une constante
SOLDE_INITIAL CONSTANT NUMBER := 1000;
-- Structure publique : déclaration d'une procédure pour créer un compte
PROCEDURE creer_compte(numero IN NUMBER);
-- Structure publique : déclaration d'une fonction pour consulter le solde
FUNCTION consulter_solde(numero IN NUMBER) RETURN NUMBER;
-- Structure publique : déclaration d'une procédure pour effectuer un dépôt
PROCEDURE effectuer_depot(numero IN NUMBER, montant IN NUMBER);
-- Structure publique : déclaration d'une procédure pour effectuer un retrait
PROCEDURE effectuer_retrait(numero IN NUMBER, montant IN NUMBER);
END GestionComptes;

14
14
I . PACKAGES
7. Exemple d’application

CREATE OR REPLACE PACKAGE BODY GestionComptes AS


-- implémentation de la procédure pour créer un compte
PROCEDURE creer_compte(numero IN NUMBER) IS
BEGIN
INSERT INTO Comptes (compte_numero, solde)
VALUES (numero, SOLDE_INITIAL);
COMMIT; -- Validation de la transaction
END creer_compte;
-- implémentation de la fonction pour consulter le solde
FUNCTION consulter_solde(numero IN NUMBER) RETURN NUMBER IS
solde_compte NUMBER;
BEGIN
SELECT solde INTO solde_compte
FROM Comptes
WHERE compte_numero = numero;
RETURN solde_compte;
END consulter_solde;

15
15
I . PACKAGES
7. Exemple d’application

-- implémentation de la procédure pour effectuer un dépôt


PROCEDURE effectuer_depot(numero NUMBER, montant NUMBER) IS
BEGIN
UPDATE Comptes
SET solde = solde + montant
WHERE compte_numero = numero;
COMMIT; -- Validation de la transaction
END effectuer_depot;
-- implémentation de la procédure pour effectuer un retrait
PROCEDURE effectuer_retrait(numero NUMBER, montant NUMBER) IS
BEGIN
UPDATE Comptes
SET solde = solde - montant
WHERE compte_numero = numero;
COMMIT;
END effectuer_retrait;
END GestionComptes;

16
16
I . PACKAGES
7. Exemple d’application
Exemple d’appels du package GestionComptes :
1. Créer un nouveau compte :
BEGIN
GestionComptes.creer_compte(123456);
COMMIT;
END;

2. Consulter le solde d'un compte :


DECLARE
solde_actuel NUMBER;
BEGIN
solde_actuel := GestionComptes.consulter_solde(123456);
DBMS_OUTPUT.PUT_LINE('Solde actuel du compte : ' || solde_actuel);
END;

3. Effectuer un dépôt sur un compte :

17
17
I . PACKAGES
6. Exemple d’application
Exemple d’appels du package GestionComptes :
3. Effectuer un dépôt sur un compte :

BEGIN
GestionComptes.effectuer_depot(123456, 500);
COMMIT;
END;

4. Effectuer un retrait d'un compte :

BEGIN
GestionComptes.effectuer_retrait(123456, 200);
COMMIT;
END;

18
18
II . Triggers

1. Définition :

Un trigger est un type de fonction qui est déclenchée automatiquement


en réponse à des opérations spécifiques telles que INSERT, UPDATE ou
DELETE effectuées sur une table.

Les triggers sont utilisés pour automatiser des actions et appliquer des
règles métier spécifiques lors de la manipulation des données.

19
19
II . Triggers

2. Composants des déclencheurs:

Une instruction de déclenchement comporte les éléments suivants :

A. Moment du déclenchement :
pour une table : BEFORE OU AFTER
pour une vue : INSTEAD OF
B. Événement déclencheur : INSERT, UPDATE ou DELETE
C. Nom de la table : sur table ou la vue
D. Type de déclencheur : ligne ou instruction
E. Clause WHEN : condition restrictive par ligne
F. Cors du déclencheur : bloc PL/SQL

20
20
II . Triggers

2. Composants des déclencheurs:

A. Moment du déclenchement :
• Triggers BEFORE (Avant) : Ces triggers sont déclenchés avant
l'exécution de l'événement sur la table. Par exemple, un trigger
BEFORE INSERT est déclenché juste avant qu'une nouvelle ligne
ne soit insérée dans une table.

• Triggers AFTER (Après) : Ils sont déclenchés après l'exécution


de l'événement sur la table. Par exemple, un trigger AFTER
UPDATE est déclenché une fois que des données ont été
mises à jour dans une table.

• Triggers INSTEAD OF (Au lieu de) : Ils sont utilisés


principalement pour les vues et sont déclenchés à la place
de l'événement (INSERT, UPDATE, DELETE) sur la vue.

21
21
II . Triggers

2. Composants des déclencheurs:

B. Événement déclencheur :
Il peut s'agir d'une opération effectuée sur une table, comme
une insertion de données, une mise à jour ou une suppression.

• INSERT
• UPDATE
• DELETE

22
22
II . Triggers

2. Composants des déclencheurs:

C. Nom de la table ou de la vue

C'est la table ou la vue sur laquelle le trigger est déclenché.

D. Type de déclencheur : ligne ou instruction:

• Ligne (Row-level) : Exécute sur chaque ligne concernée par


l'événement.

• Instruction (Statement-level) : Exécute une seule fois pour


l'ensemble de l'instruction DML, indépendamment du nombre
de lignes affectées.

23
23
II . Triggers

2. Composants des déclencheurs:

E. Clause WHEN :
Cette clause est utilisée pour les déclencheurs de ligne afin de
déterminer quelles lignes déclenchent effectivement le trigger.
F. Corps du déclencheur
Il s'agit du bloc de code PL/SQL qui contient les instructions à
exécuter lorsque le trigger est déclenché.

24
24
II . Triggers

3. Séquence d’exécution:
❖ Manipulation d’une seule ligne
Instruction :

INSERT INTO departement ( dep_id, dep_name, location_Id)


VALUES (40, ‘Informatique’, 400)

Action de déclenchement :
Déclencheur sur
instruction BEFORE
dep_id dep_name location_Id
10 Mathématiques 100
20 Marketing 200
30 Physique 300
… Déclencheur sur
ligne BEFORE
Déclencheur sur 40 Informatique 400
Déclencheur sur
instruction AFTER
ligne AFTER
25
25
II . Triggers

3. Séquence d’exécution:
❖ Manipulation des plusieurs ligne
Instruction :
UPDATE Employee
SET Sal = Sal * 1.1
WHERE dep_Id = 30
Action de déclenchement :
Déclencheur sur
instruction BEFORE
emp_id emp_name dep_Id
sur ligne BEFORE
1 HANAFI 30 sur ligne AFTER
5 KORNAFI 30

7 ZITONI 30
57 ADNAN 30
sur ligne BEFORE
Déclencheur sur 117 KHOCHAM 30 sur ligne AFTER
instruction AFTER

26
26
II . Triggers

4. Création des déclencheurs :


❖ Déclencheur sur instruction :

CREATE OR REPLACE TRIGGER nom_du_declencheur


BEFORE OU AFTER
INSERT OU UPDATE OU DELETE
ON nom_de_la_table
DECLARE
-- Déclarations variables
BEGIN
-- Corps du déclencheur (bloc PL/SQL)
-- Actions à exécuter lorsque le déclencheur est activé
END;

27
27
II . Triggers
❖ Déclencheur sur instruction :
Exemple :
Supposons que vous ayez une table produits avec des quantités
vendues et une table rapport_ventes où vous souhaitez mettre à jour
le total des ventes chaque fois que plusieurs produits sont vendus.

CREATE OR REPLACE TRIGGER trig_rapport_ventes


AFTER UPDATE OF quantite_vendue ON produits
DECLARE
total_ventes NUMBER;
BEGIN
SELECT SUM(quantite_vendue) INTO total_ventes FROM produits;

UPDATE rapport_ventes
SET total_ventes = total_ventes;
END;

Ce déclencheur d'instruction est déclenché une seule fois après la


mise à jour de la colonne quantite_vendue dans la table produits,
mettant à jour le total des ventes dans la table rapport_ventes.
28
28
II . Triggers

4. Création des déclencheurs :


❖ Déclencheur sur ligne :

CREATE OR REPLACE TRIGGER nom_du_declencheur


BEFORE OU AFTER
INSERT OU UPDATE OU DELETE
FOR EACH ROW
ON nom_de_la_table
[ WHEN (condition) ]
DECLARE
-- Déclarations variables
BEGIN
-- Corps du déclencheur (bloc PL/SQL)
-- Actions à exécuter lorsque le déclencheur est activé
END;

FOR EACH ROW : Spécifie que ce déclencheur agit sur chaque


ligne affectée par l'événement.
[ WHEN (condition) ] : Condition optionnelle qui restreint
l'activation du déclencheur en fonction de certains critères. 29
29
II . Triggers

4. Création des déclencheurs :


❖ Utilisation :NEW et :OLD :

• :NEW : Référence aux nouvelles valeurs des colonnes après une


opération INSERT ou UPDATE. Pour une insertion (INSERT), il
contient les valeurs de la nouvelle ligne. Pour une mise à jour
(UPDATE), il détient les valeurs modifiées pour cette ligne.

• :OLD : Référence aux anciennes valeurs des colonnes avant une


opération UPDATE ou DELETE. Pour une mise à jour (UPDATE),
il contient les valeurs précédant la modification pour cette
ligne. Pour une suppression (DELETE), il conserve les valeurs de
la ligne avant sa suppression.

30
30
II . Triggers

4. Création des déclencheurs :


❖ Exemple :

CREATE OR REPLACE TRIGGER trig_maj_salaire


BEFORE UPDATE ON employes
FOR EACH ROW
BEGIN
IF :NEW.salaire > :OLD.salaire THEN
RAISE_APPLICATION_ERROR(-20001, 'Le nouveau salaire ne
peut pas être supérieur à l’'ancien salaire.');

END IF;
END;
Dans cet exemple, le déclencheur trig_maj_salaire est déclenché
avant toute mise à jour sur la table employes. Si la condition
:NEW.salaire > :OLD.salaire est vraie.

RAISE_APPLICATION_ERROR : est utilisé pour déclencher une


exception avec le code d'erreur -20001 et un message spécifique. 31
31
II . Triggers

5. Gérer les déclencheurs :


• Activer ou désactiver un déclencheur :
Vous pouvez activer ou désactiver un déclencheur en utilisant
ENABLE ou DISABLE.

ALTER TRIGGER nom_declencheur ENABLE | DISABLE;

• Activer ou désactiver un déclencheur d’une table

ALTER TABLE nom_table ENABLE | DISABLE TRIGGER nom_du_declencheur ;

• Activer ou désactiver tous les déclencheur d’une table

ALTER TABLE nom_table ENABLE | DISABLE ALL TRIGGER;

• Supprimer un déclencheur :

DROP TRIGGER nom_declencheur ;


32
32

Vous aimerez peut-être aussi