0% ont trouvé ce document utile (0 vote)
268 vues32 pages

SQL - Procédures Stockées Et Triggers

Le document décrit les procédures stockées et déclencheurs SQL. Il explique comment créer et utiliser des procédures stockées, en utilisant des paramètres, structures de contrôle et boucles. Différents types de boucles sont présentés comme WHILE, REPEAT et les instructions ITERATE et LEAVE.

Transféré par

MENA 8
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
268 vues32 pages

SQL - Procédures Stockées Et Triggers

Le document décrit les procédures stockées et déclencheurs SQL. Il explique comment créer et utiliser des procédures stockées, en utilisant des paramètres, structures de contrôle et boucles. Différents types de boucles sont présentés comme WHILE, REPEAT et les instructions ITERATE et LEAVE.

Transféré par

MENA 8
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 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

[email protected]

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
Ensemble d’instructions SQL portant un nom, qu’on peut l’utiliser
pour l’appeler : call nomProcedure()
Facilitant certains traitement sur une ou plusieurs tables
(possibilité d’effectuer de tests, boucles...)
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
END

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
END

Remarques

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 |
CREATE PROCEDURE nomProcedure (les paramètres)

BEGIN
-- traitements = les instructions SQL
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 la salaire de la personne ayant le salaire
minimum dans la table personne

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

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 la salaire de la personne ayant le salaire
minimum dans la table personne

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

Déclaration de la procédure

DELIMITER |
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
INTO permet d’indiquer le nom de la variable dans laquelle on va
placer le contenu du SELECT

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
INTO permet d’indiquer le nom de la variable dans laquelle on va
placer le contenu du SELECT

Remarque

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);

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

SHOW CREATE PROCEDURE 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

SHOW CREATE PROCEDURE augmenterSalaireMin;

Pour supprimer la procédure augmenterSalaireMin

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

SHOW CREATE PROCEDURE augmenterSalaireMin;

Pour supprimer la procédure augmenterSalaireMin

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;
DECLARE min INT;
SET smic = 1200;
SELECT MIN(salaire) INTO min FROM personne;
SELECT num INTO id FROM personne WHERE salaire = min LIMIT 1;
IF min > smic THEN
UPDATE personne SET salaire = salaire + somme WHERE num = id;
ELSE
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;
DECLARE min INT;
SET smic = 1200;
SELECT MIN(salaire) INTO min FROM personne;
SELECT num INTO id FROM personne WHERE salaire = min LIMIT 1;
IF min > smic THEN
UPDATE personne SET salaire = salaire + somme WHERE num = id;
ELSE
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;
END CASE;

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;
END CASE;

Exercice

En utilisant CASE ... WHEN ... THEN ... ELSE, écrire une procédure
stockée qui permet d’augmenter le salaire de la personne qui habite à
Marseille et qui a un véhicule de 200 euros si son salaire est égal au SMIC,
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;

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;

Exercice
En utilisant WHILE ... DO, écrire une procédure stockée qui
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
UNTIL condition(s)
END REPEAT;

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


Procédures stockées

SQL

La boucle : repeat ... until


REPEAT
-- traitements
UNTIL condition(s)
END REPEAT;

Exercice
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;
IF autres_conditions THEN
ITERATE label_loop;
END IF;
END LOOP;

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;
IF autres_conditions THEN
ITERATE label_loop;
END IF;
END LOOP;

Explication

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


label_loop: LOOP
-- traitements
IF condition THEN
LEAVE label_loop;
END IF;
END LOOP;

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


Déclencheurs

SQL

Déclencheurs (triggers)

Un ensemble d’instructions SQL attaché à une table

Exécuté avant ou après un évènement sur la table de type (insertion,


modification ou suppression)

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


Déclencheurs

SQL

Déclencheurs (triggers)

Un ensemble d’instructions SQL attaché à une table

Exécuté avant ou après un évènement sur la table de type (insertion,


modification ou suppression)

Remarque

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

OLD et NEW
OLD.colonne désigne l’ancienne valeur de colonne
NEW.colonne désigne la nouvelle valeur de colonne

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


Déclencheurs

SQL

Exemple
Avant chaque insertion d’un nouveau tuple dans la table personne, si
une valeur pour la colonne ville n’a pas été renseignée, on attribue
la valeur Marseille à la colonne ville.

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


Déclencheurs

SQL

Le trigger
DELIMITER |
CREATE TRIGGER setVilleMarseille BEFORE INSERT ON
personne
FOR EACH ROW
BEGIN

IF NEW.ville IS NULL THEN


SET NEW.ville = ’Marseille’;
END IF;

END |
DELIMITER ;

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


Déclencheurs

SQL

Exercice

Écrire un trigger qui vérifie avant chaque augmentation de salaire si la


différence entre l’ancien et nouveau salaire dépasse 200 euros. Si
c’est le cas, on annule l’augmentation. Sinon, l’augmentation est
acceptée.

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


Déclencheurs

SQL

Solution
DELIMITER |
CREATE TRIGGER augmenterSalaire BEFORE UPDATE ON
personne
FOR EACH ROW
BEGIN

IF NEW.salaire >= OLD.salaire + 200 THEN


SET NEW.salaire = OLD.salaire;
END IF;

END |
DELIMITER ;

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

Vous aimerez peut-être aussi