Vous êtes sur la page 1sur 32

SQL : procédures stockées et triggers

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

06 Octobre 2017, H & H: Research and Training 1 / 20


Plan

1 Procédures stockées

2 Déclencheurs

06 Octobre 2017, H & H: Research and Training 2 / 20


Procédures stockées

SQL

Procédures stockées (stored procedures)


Disponible depuis la version 5 de MySQL I c
H
ELqu’on peut l’utiliser
Ensemble d’instructions SQL portant un U nom,
L MO
pour l’appeler : call nomProcedure()

r e f E sur une ou plusieurs tables


Facilitant certainshtraitement
A c de tests, boucles...)
c
(possibilité d’effectuer

Minimisant le trafic entre le client et le serveur de données

06 Octobre 2017, H & H: Research and Training 3 / 20


Procédures stockées

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

06 Octobre 2017, H & H: Research and Training 4 / 20


Procédures stockées

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)

Chaque requête SQL doit aussi se terminer par ;

Il faut changer le délimiteur avant le début de la procédure et le remettre


à la fin
06 Octobre 2017, H & H: Research and Training 4 / 20
Procédures stockées

SQL

Pour créer une procédure stockée


DELIMITER |
I c

CREATE PROCEDURE nomProcedure (les paramètres)
ELH
U
L MO
BEGIN
f E
hre
-- traitements = les instructions SQL
c
c A
END |
DELIMITER ;

06 Octobre 2017, H & H: Research and Training 5 / 20


Procédures stockées

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

Le montant à ajouter au salaire est passé en paramètre


I c

ELH
U
L MO
f E
c hre
c A

06 Octobre 2017, H & H: Research and Training 6 / 20


Procédures stockées

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

Le montant à ajouter au salaire est passé en paramètre


I c

ELH
U
L MO
Déclaration de la procédure
f E
DELIMITER |
c hre
c A
CREATE PROCEDURE augmenterSalaireMin(somme int)
BEGIN
DECLARE id int;

SELECT num INTO id FROM personne WHERE salaire = (SELECT MIN(salaire)
FROM personne);
UPDATE personne SET salaire = salaire + somme WHERE num = id;
END |
DELIMITER ;

06 Octobre 2017, H & H: Research and Training 6 / 20


Procédures stockées

SQL

Explication

DECLARE permet de déclarer une variable et DEFAULT de


l’initialiser
I c

ELH
INTO permet d’indiquer le nom de la variable dans laquelle on va
placer le contenu du SELECT U
L MO
f E
c hre
c A

06 Octobre 2017, H & H: Research and Training 7 / 20


Procédures stockées

SQL

Explication

DECLARE permet de déclarer une variable et DEFAULT de


l’initialiser
I c

ELH
INTO permet d’indiquer le nom de la variable dans laquelle on va
placer le contenu du SELECT U
L MO
f E
c hre
Remarque c A

SELECT INTO permet de sélectionner seulement une seule ligne.
Une erreur sera générée si la requête sélectionne plusieurs
lignes. En cas de doute, pensez à ajouter LIMIT 1.

06 Octobre 2017, H & H: Research and Training 7 / 20


Procédures stockées

SQL
Appel de la procédure (exécution)

CALL augmenterSalaireMin(50);

I c

ELH
U
L MO
f E
c hre
c A

06 Octobre 2017, H & H: Research and Training 8 / 20


Procédures stockées

SQL
Appel de la procédure (exécution)

CALL augmenterSalaireMin(50);

Pour consulter le code de la procédure augmenterSalaireMin


I c

SHOW CREATE PROCEDURE augmenterSalaireMin;
ELH
U
L MO
f E
c hre
c A

06 Octobre 2017, H & H: Research and Training 8 / 20


Procédures stockées

SQL
Appel de la procédure (exécution)

CALL augmenterSalaireMin(50);

Pour consulter le code de la procédure augmenterSalaireMin


I c

SHOW CREATE PROCEDURE augmenterSalaireMin;
ELH
U
L MO
f E
hre
Pour supprimer la procédure augmenterSalaireMin
c
c A

DROP PROCEDURE IF EXISTS augmenterSalaireMin;

06 Octobre 2017, H & H: Research and Training 8 / 20


Procédures stockées

SQL
Appel de la procédure (exécution)

CALL augmenterSalaireMin(50);

Pour consulter le code de la procédure augmenterSalaireMin


I c

SHOW CREATE PROCEDURE augmenterSalaireMin;
ELH
U
L MO
f E
hre
Pour supprimer la procédure augmenterSalaireMin
c
c A

DROP PROCEDURE IF EXISTS augmenterSalaireMin;

Remarque

On ne peut modifier une procédure avec MySQL. Il faut donc supprimer puis recréer.

06 Octobre 2017, H & H: Research and Training 8 / 20


Procédures stockées

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 ;

06 Octobre 2017, H & H: Research and Training 9 / 20


Procédures stockées

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 ;

Il existe aussi ELSEIF pour enchaı̂ner les tests.

06 Octobre 2017, H & H: Research and Training 9 / 20


Procédures stockées

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

06 Octobre 2017, H & H: Research and Training 10 / 20


Procédures stockées

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

de 200 euros le salaire de la personne qui habite à Marseille et qui a un véhicule


si son salaire est égal au SMIC,

de 100 euros sinon.

06 Octobre 2017, H & H: Research and Training 10 / 20


Procédures stockées

SQL
La boucle : WHILE ... DO
WHILE condition(s) DO
-- traitements
END WHILE;
I c

ELH
U
L MO
f E
c hre
c A

06 Octobre 2017, H & H: Research and Training 11 / 20


Procédures stockées

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

06 Octobre 2017, H & H: Research and Training 11 / 20


Procédures stockées

SQL

La boucle : repeat ... until


REPEAT
-- traitements I c

UNTIL condition(s) ELH
U
END REPEAT;
L MO
f E
c hre
c A

06 Octobre 2017, H & H: Research and Training 12 / 20


Procédures stockées

SQL

La boucle : repeat ... until


REPEAT
-- traitements I c

UNTIL condition(s) ELH
U
END REPEAT;
L MO
f E
c hre
Exercice c A

Refaire l’exercice précédent avec repeat ... until

06 Octobre 2017, H & H: Research and Training 12 / 20


Procédures stockées

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

06 Octobre 2017, H & H: Research and Training 13 / 20


Procédures stockées

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)

LEAVE permet de quitter la boucle en ignorant le reste du code (de la boucle)

06 Octobre 2017, H & H: Research and Training 13 / 20


Procédures stockées

SQL

La boucle LOOP ... LEAVE


I c

label_loop: LOOP
ELH
-- traitements
U
IF condition THEN
L MO
LEAVE label_loop;
f E
END IF;
c hre
END LOOP;
c A

06 Octobre 2017, H & H: Research and Training 14 / 20


Déclencheurs

SQL

Déclencheurs (triggers)

Un ensemble d’instructions SQL attaché à une table

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

06 Octobre 2017, H & H: Research and Training 15 / 20


Déclencheurs

SQL

Déclencheurs (triggers)

Un ensemble d’instructions SQL attaché à une table

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

Possibilité d’avoir un trigger before insert et un after insert

Possibilité d’avoir un trigger before insert et un before update

06 Octobre 2017, H & H: Research and Training 15 / 20


Déclencheurs

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

06 Octobre 2017, H & H: Research and Training 16 / 20


Déclencheurs

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

06 Octobre 2017, H & H: Research and Training 17 / 20


Déclencheurs

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 ;

06 Octobre 2017, H & H: Research and Training 18 / 20


Déclencheurs

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

06 Octobre 2017, H & H: Research and Training 19 / 20


Déclencheurs

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 ;

06 Octobre 2017, H & H: Research and Training 20 / 20

Vous aimerez peut-être aussi