Cours: Systèmes de Gestion de Bases de Données :
Procedural Language /
Structured Query
Language
(PL/SQL)
Présenté par: Mme Olfa DRIDI
[email protected] 1 © Olfa DRIDI
Les procédures et les fonctions stockées
2 © Olfa DRIDI
PL/SQL
Procédures stockées
• Les procédures sont utilisées pour effectuer une action
spécifique.
• Elles échangent les valeurs par l'intermédiaire d'une liste
d'arguments.
• Elle peut être stockée dans la BD comme un objet.
3 ©
PL/SQL
Syntaxe
4 ©
PL/SQL
5 ©
PL/SQL
Exemple
6 ©
PL/SQL
Exemple
7 ©
PL/SQL
Suppression des procédures
8 ©
PL/SQL
Fonctions stockées
• Les fonctions sont utilisées pour retourner une valeur
• Les fonctions sont appelées comme une partie d’expression
9 ©
PL/SQL
Syntaxe
10 ©
PL/SQL
Exemple
11 ©
Les déclencheurs
12 © Olfa DRIDI
PL/SQL
Les déclencheurs
• Les déclencheurs de BD sont des objets de code PL/SQL
stockés dans la base de données et qui s'exécutent
automatiquement lorsqu'un événement se produit
• Les événements déclencheurs peuvent être:
• Des insertions dans une table
• la connexion d'un utilisateur à la base de données
• Ou encore la tentative de supprimer une table ou de modifier les
paramètres d'audit
• Les triggers de BD sont associés à une et une seule table
• Il est opérationnel jusqu’à la suppression de table à laquelle il
est lié
13 ©
PL/SQL
Les déclencheurs
• Les déclencheurs peuvent appeler d'autres procédures ou
fonctions
• Le déclencheur peut être conçu pour s'exécuter une fois pour
l'instruction, ou avec chaque ligne modifiée
• Le traitement associé au trigger peut être exécuté
• soit une fois, suite à l’événement qui l’a déclenché -trigger par
ordre
• soit pour chaque ligne de la table concernée par l’événement -
trigger ligne
14 ©
PL/SQL
Les déclencheurs
Deux types: DML triggers et System triggers
• DML triggers
• Permet d’enregistrer les valeurs de toutes les modifications
apportées à la BD
• System triggers
• auditing de toute action de création, de suppression ou de
connexion à la base
15 ©
PL/SQL
Syntaxe
CREATE [OR REPLACE] TRIGGER nom_trigger
instant liste_evts
ON nom_table ou nom_vue
[REFERENCING OLD AS old | NEW AS new]
[FOR EACH ROW]
[WHEN ( condition ) ]
Corps du trigger
instant ::= AFTER | BEFORE pour les tables
liste_evts ::= evt {OR evt}
evt ::= DELETE | INSERT |
UPDATE [OF { liste_cols }]
liste_col ::= nom_col { , nom_col }
Corps du programme PL/SQL
©
PL/SQL
Syntaxe
On définit :
la table à laquelle le trigger est lié,
les instructions du LMD qui déclenchent le trigger
le moment où le trigger va se déclencher par rapport à
l'instruction LMD (avant ou après)
si le trigger se déclenche une seule fois pour toute
l'instruction (i.e. trigger instruction), ou une fois pour
chaque ligne modifiée/insérée/supprimée. (i.e. trigger
ligne, avec l'option FOR EACH ROW)
et éventuellement une condition supplémentaire de
déclenchement (clause WHEN)
©
PL/SQL
AFTER ou BEFORE
Un trigger instruction se déclenche une fois, suite à une
instruction LMD.
Un trigger ligne (FOR EACH ROW) se déclenche pour
chaque ligne modifiée par l'instruction LMD.
18 ©
PL/SQL
Ligne d’un trigger
Dans un trigger ligne, on peut faire référence à la ligne
courante, celle pour laquelle le trigger s'exécute.
Pour cette ligne, on a accès à la valeur avant l'instruction LMD
(nommée :old) et à la valeur après l'instruction (nommée
:new).
:old :new
INSERT null ligne insérée
DELETE ligne supprimée null
UPDATE ligne avant modif ligne après modif
On peut définir une condition pour un trigger ligne : le
trigger se déclenchera pour chaque ligne vérifiant la
condition: clause WHEN.
©
PL/SQL
Exemple
CREATE OR REPLACE TRIGGER journal_emp
AFTER UPDATE OF salaire ON Employe
FOR EACH ROW
WHEN (new.salaire < old.salaire) /* attention, ici on
utilise new et pas :new */
BEGIN
INSERT INTO EMP_LOG(NumEmp, date_evt, msg)
VALUES (:new.NumEmp, sysdate, 'salaire diminué');
END ;
©
PL/SQL
Exemple
CREATE OR REPLACE TRIGGER ctrlmiseajour
BEFORE INSERT OR DELETE OR UPDATE ON EMPLOYES DECLARE MESSAGE
EXCEPTION;
BEGIN
IF (TO_CHAR(SYSDATE,'DY')= 'SAM.’ OR
TO_CHAR(SYSDATE,'DY’)='DIM.') THEN RAISE MESSAGE;
END IF;
EXCEPTION
WHEN MESSAGE THEN DBMS_OUTPUT.PUT_LINE(’on ne met pas à
jour à la fin de la semaine’);
END;
21 ©
PL/SQL
Exemple 3
22 ©
© Olfa DRIDI, FSB, 2020
Les prédicats INSERTING, UPDATING, DELETING
• Lorsqu’un trigger porte sur les opérations DML, nous
pouvons ajouter des prédicats dans notre code, pour
indiquer les opérations de déclenchement :
CREATE TRIGGER ...
BEFORE INSERT OR UPDATE ON employe
.......
BEGIN
......
IF INSERTING THEN ....... END IF;
IF UPDATING THEN ........ END IF;
......
END;
©
Questions ????????
© Olfa DRIDI