Académique Documents
Professionnel Documents
Culture Documents
Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Procédures stockées
2 Déclencheurs
SQL
SQL
Pour créer une procédure stockée
CREATE PROCEDURE nomProcedure (les paramètres)
BEGIN
-- traitements = les instructions SQL
I c
END
ELH
U
L MO
f E
c hre
c A
SQL
Pour créer une procédure stockée
CREATE PROCEDURE nomProcedure (les paramètres)
BEGIN
-- traitements = les instructions SQL
I c
END
ELH
U
L MO
f E
Remarques
c hre
c A
Chaque instruction SQL d’une procédure doit se terminer par ;
(délimiteur)
SQL
SQL
Exemple
Créons une procédure stockée qui augmente le salaire de la personne ayant le plus petit
salaire de la table personne
SQL
Exemple
Créons une procédure stockée qui augmente le salaire de la personne ayant le plus petit
salaire de la table personne
SQL
Explication
SQL
Explication
SQL
Appel de la procédure (exécution)
CALL augmenterSalaireMin(50);
I c
ELH
U
L MO
f E
c hre
c A
SQL
Appel de la procédure (exécution)
CALL augmenterSalaireMin(50);
SQL
Appel de la procédure (exécution)
CALL augmenterSalaireMin(50);
SQL
Appel de la procédure (exécution)
CALL augmenterSalaireMin(50);
Remarque
On ne peut modifier une procédure avec MySQL. Il faut donc supprimer puis recréer.
SQL
Il est possible d’utiliser une structure de contrôle de type if ... then ... else
DELIMITER |
CREATE PROCEDURE augmenterSalaireMin(somme int)
BEGIN
DECLARE id INT;
DECLARE smic INT;
I c
DECLARE min INT;
SET smic = 1200;
ELH
SELECT MIN(salaire) INTO min FROM personne;
U
MO
SELECT num INTO id FROM personne WHERE salaire = min LIMIT 1;
L
IF min > smic THEN
f E
hre
UPDATE personne SET salaire = salaire + somme WHERE num = id;
ELSE
c
c A
UPDATE personne SET salaire = smic + somme WHERE num = id;
END IF;
END |
DELIMITER ;
SQL
Il est possible d’utiliser une structure de contrôle de type if ... then ... else
DELIMITER |
CREATE PROCEDURE augmenterSalaireMin(somme int)
BEGIN
DECLARE id INT;
DECLARE smic INT;
I c
DECLARE min INT;
SET smic = 1200;
ELH
SELECT MIN(salaire) INTO min FROM personne;
U
MO
SELECT num INTO id FROM personne WHERE salaire = min LIMIT 1;
L
IF min > smic THEN
f E
hre
UPDATE personne SET salaire = salaire + somme WHERE num = id;
ELSE
c
c A
UPDATE personne SET salaire = smic + somme WHERE num = id;
END IF;
END |
DELIMITER ;
SQL
Autre structure de contrôle : CASE ... WHEN ... THEN ... ELSE
CASE nomVariable
WHEN value1 THEN traitement1;
WHEN value2 THEN traitement2;
...
ELSE autreTraitement;
I c
END CASE;
ELH
U
L MO
f E
c hre
c A
SQL
Autre structure de contrôle : CASE ... WHEN ... THEN ... ELSE
CASE nomVariable
WHEN value1 THEN traitement1;
WHEN value2 THEN traitement2;
...
ELSE autreTraitement;
I c
END CASE;
ELH
U
L MO
f E
hre
Exercice
c
c A
En utilisant CASE ... WHEN ... THEN ... ELSE, écrire une procédure stockée
qui permet d’augmenter
SQL
La boucle : WHILE ... DO
WHILE condition(s) DO
-- traitements
END WHILE;
I c
ELH
U
L MO
f E
c hre
c A
SQL
La boucle : WHILE ... DO
WHILE condition(s) DO
-- traitements
END WHILE;
I c
ELH
U
L MO
f E
hre
Exercice
A c
En utilisant WHILE ... DO, écrire une procédure stockée qui
c
prend deux paramètres : n et somme
permet d’ajouter n fois somme au salaire de la personne qui habite
à Marseille et qui a un véhicule
SQL
SQL
SQL
On peut aussi définir des libellés et utiliser ITERATE ... LEAVE
label_loop: boucle -- peut être WHILE, REPEAT ou autre
-- traitements
IF conditions THEN
LEAVE label_loop;
END IF;
I c
IF autres_conditions THEN
ELH
ITERATE label_loop;
U
END IF;
L MO
END LOOP;
f E
c hre
c A
SQL
On peut aussi définir des libellés et utiliser ITERATE ... LEAVE
label_loop: boucle -- peut être WHILE, REPEAT ou autre
-- traitements
IF conditions THEN
LEAVE label_loop;
END IF;
I c
IF autres_conditions THEN
ELH
ITERATE label_loop;
U
END IF;
L MO
END LOOP;
f E
c hre
Explication
c A
ITERATE permet de relancer une itération en ignorant le reste du code (de la
boucle)
SQL
SQL
Déclencheurs (triggers)
I c
Exécuté avant ou après un évènement sur la table de type (insertion,
modification ou suppression)
ELH
U
L MO
f E
c hre
c A
SQL
Déclencheurs (triggers)
I c
Exécuté avant ou après un évènement sur la table de type (insertion,
modification ou suppression)
ELH
U
L MO
f E
Remarque
A c hre
c
Pour une table donnée, un seul trigger par évènement et par moment
SQL
I
c
OLD et NEW
E L H
U
O colonne
OLD.colonne désigne l’ancienne valeur de
L M
NEW.colonne désignef laE
c h re nouvelle valeur de colonne
c A
SQL
I
c
Exemple
EL H
O
Avant chaque insertion d’un nouveau tuple Udans la table personne, si
M
f ELn’a
une valeur pour la colonne ville
la valeur Marseille à rlaecolonne
pas été renseignée, on attribue
ville.
A ch
c
SQL
Le trigger
DELIMITER |
CREATE TRIGGER setVilleMarseille BEFORE INSERT ON
personne
I c
FOR EACH ROW
ELH
U
BEGIN
L MO
f E
IF NEW.ville IS NULL THEN
c hre
c A
SET NEW.ville = ’Marseille’;
END IF;
END |
DELIMITER ;
SQL
Exercice
I
c
H
EL de salaire si la
différence entre l’ancien et nouveau M
U
Écrire un trigger qui vérifie avant chaque augmentation
O dépasse 200 euros. Si
salaire
L
f E Sinon, l’augmentation est
c’est le cas, on annule l’augmentation.
acceptée. c h r e
c A
SQL
Solution
DELIMITER |
CREATE TRIGGER augmenterSalaire BEFORE UPDATE ON
personne
I c
FOR EACH ROW
ELH
U
BEGIN
L MO
f E
hre
IF NEW.salaire >= OLD.salaire + 200 THEN
c
c A
SET NEW.salaire = OLD.salaire;
END IF;
END |
DELIMITER ;