Cours 6 : Les boucles
Gestion de données
Mme RIFAI Meriem
03/11/2025 BASES DE DONNÉES
WHILE
La boucle WHILE est une instruction de boucle qui exécute un
bloc de code de manière répétée tant qu'une condition est
vraie.
Pour l’utilisation de la boucle WHILE, on utilise la syntaxe :
[labele_debut:] WHILE condition DO
liste des instructions
END WHILE [labele_fin]
2
03/11/2025 BASES DE DONNÉES
WHILE
DELIMITER $$
CREATE PROCEDURE dowhile ()
BEGIN
DECLARE v1 INT DEFAULT 5 ;
WHILE v1 > 0 DO
select v1;
SET v1 = v1 – 1 ;
END WHILE ;
END $$
Delimiter ;
Call dowhile();
3
03/11/2025 BASES DE DONNÉES
WHILE
DELIMITER $$
CREATE PROCEDURE dowhile ()
BEGIN
DECLARE v1 INT DEFAULT 5 ;
boucle1: WHILE v1 > 0 DO
select v1;
SET v1 = v1 – 1 ;
END WHILE boucle1 ;
END $$
Delimiter ;
Call dowhile();
4
03/11/2025 BASES DE DONNÉES
REAPEAT
La liste d'instructions dans une instruction REPEAT est
répétée jusqu’à (UNTIL) ce que l'expression condition
soit vraie.
Ainsi, un REPEAT entre toujours dans la boucle au moins
une fois.
liste_instructions se compose d'une ou plusieurs
instructions, chacune terminée par un délimiteur
d'instruction point-virgule (;).
03/11/2025 BASES DE DONNÉES
REPEAT
DELIMITER //
CREATE PROCEDURE dorepeat (p1 INT)
BEGIN
SET @x = 0 ;
REPEAT
Select @x;
SET @x = @x + 1 ;
UNTIL @x > p1
END REPEAT;
END //
DELIMITER;
Call dorepeat(5);
6
03/11/2025 BASES DE DONNÉES
LOOP
L'instruction LOOP vous permet d'exécuter une ou
plusieurs instructions à plusieurs reprises.
[labele_debut:] LOOP
statement_list
END LOOP [label_fin]
03/11/2025 BASES DE DONNÉES
LOOP
L'instruction LOOP vous permet d'exécuter une ou
plusieurs instructions à plusieurs reprises.
boucle1: LOOP
-- instructions
LEAVE boucle1; -- pour quitter la boucle
END LOOP boucle1
03/11/2025 BASES DE DONNÉES
CREATE TABLE test (VALUE INT NULL DEFAULT NULL) ;
DELIMITER $$
CREATE PROCEDURE ps_nombres()
BEGIN
LOOP
DECLARE a INT DEFAULT 1 ;
simple_loop : LOOP
INSERT INTO test VALUES (a) ;
SET a = a + 1 ;
IF a = 11 THEN
LEAVE simple_loop ;
END IF ;
END LOOP simple_loop;
END $$
CALL ps_nombres();
SELECT value FROM test;
03/11/2025 BASES DE DONNÉES
DELIMITER $$
CREATE PROCEDURE boucle_loop_exemple()
BEGIN
DECLARE compteur INT DEFAULT 1;
LOOP
-- Début de la boucle avec un label "boucle1"
boucle1: LOOP
-- Afficher le compteur
SELECT compteur;
-- Incrémenter le compteur
SET compteur = compteur + 1;
-- Quitter la boucle si le compteur est supérieur à 5
IF compteur > 5 THEN
LEAVE boucle1;
END IF;
END LOOP boucle1;
END$$
DELIMITER ; 1
0
03/11/2025 BASES DE DONNÉES
LOOP
L’instruction LEAVE sort immédiatement de la boucle.
Cela fonctionne comme l'instruction break dans
d'autres langages de programmation comme PHP,
C/C++ et Java.
L’instruction ITERATE est utilisée pour ignorer
l'itération de la boucle en cours et démarrer une
nouvelle itération.
L'ITERATE est similaire à l'instruction continue en PHP,
C/C++ et Java. 1
1
03/11/2025 BASES DE DONNÉES
DROP PROCEDURE LoopDemo ;
DELIMITER $$
CREATE PROCEDURE LoopDemo()
BEGIN
DECLARE x INT DEFAULT 0 ; LOOP
DECLARE str VARCHAR (255) ;
SET str = " ;
loop_label : LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF ;
SET x = x + 1 ;
IF (x mod 2) THEN
ITERATE loop_label ;
ELSE
SET str = CONCAT (str,x,’,’) ;
END IF ;
END LOOP ;
SELECT str ;
END$$
DELIMITER ; 1
2
03/11/2025 BASES DE DONNÉES
Exercices
1. Ecrire une Fonction FACTORIELLE qui prend en paramètre un nombre X puis calcule et
retourne sa factorielle
2. Créez une procédure stockée qui affiche les entiers de 10 à 1 à l’aide d’une boucle
WHILE.
3. Créez une procédure stockée qui calcule la somme des entiers de 1 à N, où N est un
paramètre d’entrée.
4. Calcul de la somme des entiers de 1 à N en utilisant une boucle REPEAT
5. Affichage de la table de multiplication d’un nombre donné n en utilisant une boucle
REPEAT.
6. Créer une procédure stockée qui additionne les nombres de 1 à 10 et quitte la boucle
dès que la somme dépasse 20.
7. Créer une procédure qui insère des valeurs dans une table test_table, mais ignore les
valeurs entre 3 et 5.
8. Créer une procédure qui recherche le premier multiple de 7 entre 1 et 20, et quitte la
boucle dès qu’il est trouvé.
03/11/2025 BASES DE DONNÉES
Exercice
1. Créez une nouvelle table Produits avec les colonnes suivantes : id (clé primaire),Nom,
quantite ,prix_unitaire,
2. Insérez quelques données de test dans la table Produits.
3. Créez une procédure stockée nommée MiseAJourStock qui prend un paramètre
d'entrée seuil et met à jour la colonne quantite de la table Produits comme suit :
• Si la quantité est inférieure au seuil, ajoutez 10 unités.
• Sinon, réduisez la quantité de 5 unités.
1. Créez une boucle (une procédure stockée ou une fonction) qui parcourt tous les
produits et affiche le nom du produit et un message indiquant s'il est en stock
(quantité supérieure à zéro) ou non. Utilisez un test IF et ELSE.
2. Écrivez une requête qui utilise la procédure MiseAJourStock avec un seuil de 20.
03/11/2025 BASES DE DONNÉES
Cours 5 : Les Structure
de contrôle conditionnelle
Gestion de données
Mme RIFAI Meriem
03/11/2025 BASES DE DONNÉES
Instruction conditionnelle
IF-THEN
L’instruction IF implémente une construction
conditionnelle de base lorsque l’expression est
évaluée à false. Sa syntaxe est la suivante
IF expression THEN
statements;
END IF;
2
03/11/2025 BASES DE DONNÉES
Instruction conditionnelle
IF-ELSE
IF condition THEN
instructions;
ELSE
instructions;
END IF;
03/11/2025 BASES DE DONNÉES
Exemple
IF SUBSTR (v_telephone,1,2) = ‘06’ THEN
SELECT ‘’C’est un portable’ ;
ELSE
SELECT ‘’C’est un fixe … ‘’ ;
END IF ;
03/11/2025 BASES DE DONNÉES
Instruction conditionnelle
IF-ELSEIF-ELSE
IF condition1 THEN
instructions;
ELSEIF condition2 THEN
Instructions2;
ELSE
instructions3;
END IF;
5
03/11/2025 BASES DE DONNÉES
; // Exemple
DELIMITER //
CREATE FUNCTION IncomeLevel (monthly_value INT)
RETURNS VARCHAR(20)
BEGIN
DECLARE income_level VARCHAR(20);
IF monthly_value <= 4000 THEN
SET income_level = ‘Low Income’ ;
ELSEIF monthly_value > 4000 AND monthly_value <= 7000 THEN
SET income_level = ‘Avg Income’ ;
ELSE
SET income_level = ‘High Income’ ;
END IF ;
RETURN income_level ;
END //
6
DELIMITER ;
03/11/2025 BASES DE DONNÉES
Case avec sélecteur
CASE variable_selecteur
WHEN expr1 THEN instructions1;
WHEN expr2 THEN instructions2;
…
WHEN exprN THEN instructionsN;
[ELSE instructionsN+1;]
END CASE ;
03/11/2025 BASES DE DONNÉES
Delimiter $$
CREATE PROCEDURE GetCustomerShipping (IN pCustomerNumber INT,
Case avec sélecteur
OUT pShipping VARCHAR(50))
BEGIN
DECLARE customerCountry VARCHAR(100);
SELECT country INTO customerCountry FROM customers
WHERE customerNumber = pCustomerNumber ;
CASE customerCountry
WHEN ‘USA’ THEN
SET pShipping = ‘2-day Shipping’ ;
WHEN ‘Canada’ THEN
SET pShipping = ‘3-day Shipping’ ;
ELSE
SET pShipping = ‘5-day Shipping’ ;
END CASE ;
END$$
DELIMITER ;
8
03/11/2025 BASES DE DONNÉES
Case sans sélecteur
CASE
WHEN condition1 THEN instructions1;
WHEN condition2 THEN instructions2;
…
WHEN condition¨N THEN instructionsN;
[ELSE instructionsN+1;]
END CASE ;
03/11/2025 BASES DE DONNÉES
Case sans sélecteur
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN ‘’The quantity is greater than 30’’
WHEN Quantity=30 THEN ‘’The quantity is 30’’
ELSE ’’The quantity is under 30’’
END
FROM OrderDetails;
1
0
03/11/2025 BASES DE DONNÉES
Case sans sélecteur
DECLARE v_mention CHAR(2) ;
DECLARE v_note DECIMAL(4,2) DEFAULT 9.8 ;
CASE
WHEN v_note >= 16 THEN SET v_mention := ‘TB’;
WHEN v_note >= 14 THEN SET v_mention := ‘B’;
WHEN v_note >= 12 THEN SET v_mention := ‘AB’;
WHEN v_note >= 10 THEN SET v_mention := ‘P’;
ELSE SET v_mention := ‘R’;
END CASE ;
1
1
03/11/2025 BASES DE DONNÉES
Manipuler les
curseurs
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
Définition
▪ Un curseur est une zone mémoire qui est générée côté serveur (mise en cache) et qui permet de
traiter individuellement chaque ligne renvoyée par un SELECT.
▪ Un sous-programme peut travailler avec plusieurs curseurs en même temps. Un curseur, durant son
existence (de l’ouverture à la fermeture), contient en permanence l’adresse de la ligne courante.
PARTIE 1
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 2
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
▪ Tout curseur MySQL dispose des propriétés suivantes :
Read-only (lecture seule)
• Aucune modification dans la base n’est possible à travers ce dernier (sauf si on ajoute la clause FOR UPDATE) ;
Non-scrollable (non navigable)
• Une fois ouvert, le curseur est parcouru du début à la fin sans pouvoir revenir à l’enregistrement précédent ;
Asensitive (insensible )
PARTIE 1
• Toute mise à jour opérée dans la base de données n’est pas répercutée dans le curseur une fois ouvert (utilise
une copie temporaire des données et ne pointe pas sur les données réelles.)
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 3
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
Syntaxe
Pour l’utilisation des curseurs on suit les étapes suivantes :
1. Déclaration du curseur avant la déclaration des variables
2. Utilisation de l'instruction OPEN pour initialiser le jeu de résultats pour le curseur
3. Utilisation de l’instruction FETCH pour récupérer la ligne suivante pointée par le curseur et déplacer le
curseur vers la ligne suivante dans le jeu de résultats.
4. 4-Fermeture du curseur.
DECLARE nom_curseur CURSOR FOR instruction_SELECT
OPEN nom_curseur;
PARTIE 1
FETCH nom_curseur INTO liste_variables;
CLOSE nom_curseur;
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 4
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
DELIMITER $$
Exemple
CREATE PROCEDURE lister_clients (INOUT resultat_txt VARCHAR(4000))
▪ Ce curseur permet de construire une chaine contenant BEGIN
les emails des employés. DECLARE finished INTEGER DEFAULT 0 ;
▪ Remarques : DECLARE v_id INT ;
DECLARE v_nom VARCHAR (100) ;
▪ Un curseur doit toujours être associé à une DECLARE v_prenom VARCHAR (100) ;
instruction SELECT. DECLARE info VARVHAR (400) DEFAULT ‘’’’ ;
▪ Lorsque on travaille avec le curseur MySQL, on doit DECLARE cur_info_client CURSOR FOR SELECT id,nom,prenom FROM clients;
également déclarer un gestionnaire NOT FOUND DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
pour gérer la situation où le curseur ne trouve OPEN cur_info_client ;
boucle_parcours_clients : LOOP
aucune ligne.
FETCH cur_info_client INTO v_id, v_nom, v_prenom ;
- - Appel de la ps IF finished = 1 THEN
SET @resultat_txt = ‘’’’; LEAVE boucle_parcours_clients ;
CALL lister_clients(@resltat_txt) ; END IF ;
PARTIE 1
SELECT @resultat_txt ; SET info = CONCAT (v_id, ’’-’’,v_nom,’’-’,v_prenom);
SET resultat_txt = CONCAT (info, ’’;’’,resultat_txt) ;
END LOOP boucle_parcours_clients ;
CLOSE cur_info_client;
END $$
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 5
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
Curseur pour modification
▪ Si on veut verrouiller les lignes d’une table interrogée par un curseur dans le but de mettre à jour la table, sans qu’un autre utilisateur ne la
modifie en même temps, il faut utiliser la clause FOR UPDATE. Elle s’emploie lors de la déclaration du curseur et verrouille les lignes
concernées dès l’ouverture du curseur.
▪ Les verrous sont libérés à la fin de la transaction. boucle _parcours_clients : LOOP
FETCH cur_info_client INTO v_id,v_nom,v_prenom,v_adresse;
DELIMITER $$
IF finished = 1 THEN
CREATE PROCEDURE lister_clients_avec_MAJ_adresse ( INOUT resultat_txt VARCHAR (4000))
LEAVE boucle _parcours_clients ;
BEGIN
END IF;
DECLARE finished INTEGER DEFAULT 0 ;
IF UPPER(v_adresse)=‘AGADIR’ THEN
DECLARE v_id INT ;
UPDATE clients
DECLARE v_nom VARCHAR(100) ;
SET adresse = ‘GRANDE AGADIR’
DECLARE v_prenom VARCHAR(100) ;
WHERE id = v_id;
DECLARE v_adresse VARCHAR(100) ;
END IF;
DECLARE info VARCHAR(400) DEFAULT ‘’’’ ;
SET info = CONCAT (v_id, ’’-’’,v_nom,’’-’,v_prenom);
PARTIE 1
DECLARE cur_info_client CURSOR FOR SELECT id,nom,prenom,adresse
SET resultat_txt = CONCAT (info, ’’;’’,resultat_txt) ;
FROM clients FOR UPDATE ;
END LOOP boucle_parcours_clients ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1 ;
CLOSE cur_info_client;
OPEN cur_info_client ;
END $$
DELIMITER ;
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 6
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
Restrictions d’utilisation
Il n’est pas possible de déclarer un curseur FOR UPDATE en utilisant dans la requête les directives :
▪ DISTINCT ;
▪ GROUP BY;
▪ Un opérateur ensembliste ;
▪ Une fonction d’agrégat.
PARTIE 1
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 7
Exercices
Exercice 1
Écrire un bloc MySQL permettant de :
1. Créer deux tables Emp1 et Emp2 qui contiennent les colonnes Idemp, NomEmp, sal et deptno de la table
Emp.
◦ Utiliser un curseur pour sélectionner les colonnes Idemp, NomEmp, sal et deptno de tous les employés de la table Emp.
◦ Parcourir ce curseur afin d’insérer dans Emp1 les employés gagnant plus que 3000 DH et dans Emp2 les autres employés.
◦ Afficher le nombre de tous les employés dans le curseur.
2. Utiliser un curseur pour sélectionner les colonnes Idemp, NomEmp, sal et deptno des employés de la
table Emp qui ont un salaire entre X et Y.
◦ Parcourir les lignes de ce curseur afin de les insérer dans Emp1.
◦ Afficher le nombre de tous les employés dans le curseur.
Exercices
Exercice 2
Écrire un programme MySQL qui met tous les vendeurs (Id, nom, Service, salaire) dans une table Archive.
Écrire un programme MySQL qui stocke dans une table Archive1 les N premiers vendeurs.
Exercice 3
Créez une procédure stockée qui utilise un curseur pour mettre à jour les prix de tous les produits dans la table
"produits" en ajoutant 10%.
Créez une procédure stockée qui utilise un curseur pour mettre à jour la quantité en stock des produits en
ajoutant un nombre spécifique.
Gérer les
exceptions
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Introduction
▪ Afin d’éviter qu’un programme ne s’arrête dès la première erreur suite à une instruction SQL, il est indispensable de prévoir
les cas potentiels d’erreurs et d’associer à chacun de ces cas la programmation d’une exception (handler dans le vocabulaire
de MySQL).
▪ Les exceptions peuvent être gérées dans un sous-programme (fonction ou procédure cataloguée) ou un déclencheur.
▪ Une exception MySQL correspond à une condition d’erreur et peut être associée à un identificateur (exception nommée).
▪ Une exception est détectée (aussi dite « levée ») si elle est prévue dans un handler au cours de l’exécution d’un bloc (entre
BEGIN et END ).
▪ Une fois levée, elle fait continuer (ou sortir du bloc) le programme après avoir réalisé une ou plusieurs instructions que le
programmeur aura explicitement spécifiées.
PARTIE 1
▪ Deux mécanismes qui peuvent être mis en œuvre pour gérer une exception en Mysql : CONTINUE et EXIT.
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 2
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Syntaxe
DECLARE handler_action HANDLER • CONTINUE : (appelée handler) force à poursuivre l’exécution de
FOR condition_value [ , condition_value] … programme lorsqu’il se passe un événement prévu dans la clause FOR
statement • EXIT fait sortir l’exécution du bloc courant entre BEGIN et END
Handler_action : { • SQLSTATE : code d’erreur qui permet de couvrir toutes les erreurs d’un
état donné.
CONTINUE
([Link]
| EXIT [Link])
| UNDO • nomException : s’applique à la gestion des exceptions nommées
} (étudiées plus loin).
Condition_value : {
• SQLWARNING :permet de couvrir toutes les erreurs d’état SQLSTATE
débutant par 01.
mysql_error_code
• NOT FOUND : permet de couvrir toutes les erreurs d’état SQLSTATE
| SQLSTATE [VALUE] sqlstate_value débutant par 02 (relatives à la gestion des curseurs).
| condition_name • SQLEXCEPTION : gère toutes les erreurs qui ne sont ni gérées par
PARTIE 1
| SQLWARNING SQLWARNING ni par NOT FOUND
| NOT FOUND • statement MySQL : une ou plusieurs instructions du langage de MySQL
| SQL EXCEPTION (bloc, appel possibles par CALL d’une fonction ou d’une procédure
cataloguée).
}
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 3
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Syntaxe
DECLARE CONTINUE HANDLER FOR SQLSTATE '45000' DECLARE EXIT HANDLER FOR SQLSTATE '45000'
BEGIN BEGIN
-- Gérer l'exception ici -- Gérer l'exception et quitter
SELECT 'Erreur détectée' AS message; SELECT 'Erreur détectée' AS message;
END; END;
DECLARE UNDO HANDLER FOR SQLSTATE '45000'
BEGIN
-- Annuler la dernière instruction
PARTIE 1
ROLLBACK;
SELECT 'Erreur détectée' AS message;
END;
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 4
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Exceptions avec EXIT
▪ Essayons d’insérer un client sans spécifier le champs
obligatoire (NOT NULL) nom. Une exception et déclenchée
ayant le code 1048.
▪ Gérons nous cette exception avec le handler Exit
DELIMITER//
CREATE PROCEDURE ps_ajouter_client_Exception1(IN p_nom VARCHAR (200),
IN p_prenom VARCHAR(200),
IN p_adresse VARCHAR(200))
BEGIN
DECLARE flagNOTNULL BOOLEAN DEFAULT 0 ;
BEGIN - - début bloc de déclaration des deux exceptions
DECLARE EXIT HANDLER FOR 1048
SET flagNOTNULL = -1;
INSERT INTO clients (nom, prenom, adresse) VALUES (p_nom, p_prenom, p_adresse);
SELECT ‘le client est ajouté avec succès’;
PARTIE 1
END; - - fin bloc de déclaration des deux exceptions
IF flagNOTNULL THEN
SELECT CONCAT (‘Le chmp nom doit être non null’) AS ‘Resultat ps_ajouter_client_Exception1’;
END IF;
END//
DELIMITER ;
CALL ps_ajouter_client_Exception1(null, ‘Saloua’, ‘Safi’);
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 5
Delimiter //
01 – Maitriser le langage de programmation
CREATE PROCEDURE
procédurale sousps_exc_not_found_Exemple
MySQL (IN p_nom VARCHAR (200))
Gestion des exceptions BEGIN
DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 ;
DECLARE flagPlusDun BOOLEAN DEFAULT 0 ;
DECLARE var1 VARCHAR(20) ;
Exceptions avec EXIT BEGIN
DECLARE EXIT HANDLER FOR 1172
▪ L’ exemple suivant SET flagPlusDun = -1;
décrit une DECLARE EXIT HANDLER FOR NOT FOUND
SET flagNOTFOUND = -1;
procédure qui gère SELECT nom INTO var1 FROM clients
une erreur : ‘aucun WHERE prenom = p_nom ;
SELECT CONCAT (‘Le seul client avec le nom ‘, p_nom, ‘ est ‘, var1) AS ‘Resultat
client n’est associé à ps_exc_not_found_Exemple1’;
ID passé en END;
IF flagNOTFOUND THEN
paramètre (NOT SELECT CONCAT (‘Il n`’y a pas de client aven le nom ‘, p_nom) AS ‘Resultat
FOUND)’. ps_exc_not_found_Exemple1’ ;
END IF;
IF flagPlusDun THEN
SELECT CONCAT (‘Il y a plusieurs client aven le nom ‘, p_nom) AS ‘Resultat
PARTIE 1
ps_exc_not_found_Exemple1’ ;
END IF;
END //
Delimiter ;
CALL ps_exc_not_found_Exemple1(‘Dalaj’);
6
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Exception FOR SQLEXCEPTION
▪ L’exemple suivant décrit
DELIMITER //
une procédure qui gère CREATE PROCEDURE autreErreur ()
une erreur non spécifique . BEGIN
▪ Remarque: MySQL ne permet SELECT ‘Une autre erreur est survenue’ ;
END //
pas, pour l’instant, de
DELIMITER ;
récupérer dynamiquement,
CREATE PROCEDURE handlerdemoSQLEXCEPTION ()
au sein d’un sous- BEGIN
programme, le code et le DECLARE EXIT HANDLER FOR SQLEXCEPTION CALL autreErreur();
message de l’erreur associée INSERT INTO table_inexistante VALUES (1);
à une exception levée suite à SET @x = 99;
PARTIE 1
END//
une instruction SQL, et qui
DELIMITER ;
n’a pas été prévue dans un CALL handlerdemoSQLEXCEPTION();
handler SELECT @x;
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 7
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Exceptions avec Continue
CREATE TABLE test (code INT, PRIMARY KEY (code));
▪ L’exemple suivant décrit une DELIMITER //
procédure qui gère une
CREATE PROCEDURE handlerdemo ()
erreur : Sqlstate : BEGIN
ER_DUP_KEY ‘23000’ DECLARE CONTINUE HANDLER FOR SQLSTATE ‘23000’
▪ Malgré qu’une exception de SET @x2 = 1;
SET @x = 1;
duplication de clé primaire INSERT INTO test
ER_DUP_KEY est causée par VALUES (1);
l’instruction insert, SET @x= 2;
l'exécution des instructions INSERT INTO test VALUES (1);
après insert continue et la SET @x = 3;
PARTIE 1
END//
variable de session @x est DELIMITER ;
initialisée. CALL handlerdemo();
SELECT @x;
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 8
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
Exceptions nommées (condition)
▪ Pour intercepter une erreur MySQL et lui attribuer au passage un identificateur, il faut
utiliser la clause DECLARE CONDITION.
▪ Pour la déclaration, on utilise la syntaxe suivante :
DECLARE nomException CONDITION FOR
{SQLSTATE [VALUE] ‘valeur_sqlstate’ | code_erreur_mysql}
DECLARE CONTINUE HANDLER FOR customError
BEGIN
DECLARE customError CONDITION FOR SQLSTATE '45000'; -- Gérer l'exception personnalisée ici
PARTIE 1
SELECT 'Erreur personnalisée détectée' AS message;
END;
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 9
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
DELIMITER //
Exceptions nommées (condition)
CREATE PROCEDURE insert_employee(IN emp_id INT, IN emp_name VARCHAR(100))
BEGIN
-- Déclarer une condition nommée pour la duplication de clé primaire
DECLARE duplication_error CONDITION FOR SQLSTATE '23000';
-- Déclarer un handler pour la condition nommée
DECLARE CONTINUE HANDLER FOR duplication_error
BEGIN
-- Message d'erreur si la clé primaire est dupliquée
SELECT 'Erreur : Duplication de clé primaire détectée';
END;
-- Tentative d'insertion de données
PARTIE 1
INSERT INTO employees (id, name) VALUES (emp_id, emp_name);
-- Message de succès si aucune erreur
SELECT 'Insertion réussie' AS message;
END // COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 10
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
L’instruction SIGNAL
▪ On utilise l'instruction SIGNAL pour renvoyer une condition CREATE PROCEDURE ajouter_commande (IN commandeNo,
IN produitCode varchar(45),
d'erreur ou d'avertissement à l'appelant à partir d'un sous IN qte int,
programme, par exemple une procédure stockée, une IN prix double,
fonction stockée, un déclencheur ou un événement. IN ligneNO int )
BEGIN
L'instruction SIGNAL permet de contrôler les informations à
DECLARE C INT ;
renvoyer, telles que la valeur et le message SQLSTATE. SELECT COUNT (commandeNumber) INTO C
FROM commandes
▪ Pour l’utilisation de l’instruction, on utilise la syntaxe
WHERE commandeNumber = commandeNo;
suivante : - - teste si le numéro de la commande existe
SIGNAL SQLSTATE | nom_exception_nomee; IF (C != 1) THEN
SET info_1 = valeur_1, SIGNAL SQLSTATE ‘45000’
SET MESSAGE_TEXT =
info_2= valeur_2, etc; ‘Commande introuvable’;
PARTIE 1
▪ Info pour prendre : END IF ;
- - suite de code a exécuter si pas d’erreur
MESSAGE_TEXT, MYSQL_ERRNO , SCHEMA_NAME,
--…
nom_table, COLUMN_NAME, END
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 11
01 – Maitriser le langage de programmation procédurale sous MySQL
Gestion des exceptions
L’instruction RESIGNAL
▪ l'instruction RESIGNAL est similaire à l'instruction DELIMITER $$
SIGNAL en termes de fonctionnalité et de syntaxe, CREATE PROCEDURE Divide (IN numerator INT,
sauf que : IN denominator INT,
OUT result double)
▪ On doit utiliser l'instruction RESIGNAL dans un BEGIN
gestionnaire d'erreurs ou d'avertissements, DECLARE division_by_zero CONDITION FOR SQLSTATE ‘22012’ ;
sinon on obtient un message d'erreur « DECLARE CONTINUE HANDLER FOR division_by_zero
RESIGNAL lorsque le gestionnaire n'est pas actif RESIGNAL SET MESSAGE_TEXT = ‘Division by zero / Denominator
cannot be zero’;
». Notons qu’on peut utiliser l'instruction --
SIGNAL n'importe où dans une procédure IF denominator = 0 THEN
stockée. SIGNAL division_by_zero;
ELSE
▪ On peut omettre tous les attributs de SET result := numerator / denominator;
PARTIE 1
l'instruction RESIGNAL, même la valeur END IF ;
END
SQLSTATE.
COPYRIGHT - TOUT DROIT RÉSERVÉ - OFPPT 12
Exercice :
Objectif : Créez une table nommée employee avec les colonnes suivantes :
employee_id (clé primaire, entier)
employee_name (varchar)
salary (decimal)
Ensuite, créez une procédure stockée nommée update_salary qui prend en entrée un
employee_id et une nouvelle salary. La procédure doit mettre à jour le salaire de l'employé
correspondant dans la table. Cependant, elle doit gérer les erreurs suivantes :
Si l'employé avec l'ID spécifié n'existe pas, la procédure doit générer une erreur.
Si la nouvelle salary est négative, la procédure doit générer une erreur.
Cours 3 : Les Fonctions
Définies par l’Utilisateur
Gestion de données
Mme RIFAI Meriem
Qu'est-ce que la Programmation
Procédurale ?
La programmation procédurale en MySQL fait
référence à l'utilisation de routines procédurales,
telles que les fonctions et les procédures stockées,
pour effectuer des opérations spécifiques dans une
base de données MySQL. Ces routines sont créées
en utilisant le langage SQL procédural et peuvent
être considérées comme des sous-programmes ou
des scripts stockés au sein de la base de données
elle-même. 2
2019-2020 BASES DE DONNÉES
Qu'est-ce que la Programmation
Procédurale ?
Voici quelques points clés pour comprendre la
programmation procédurale en MySQL :
Routines Procédurales : Les deux principales formes de
routines procédurales en MySQL sont les fonctions et les
procédures stockées. Les fonctions renvoient
généralement une valeur, tandis que les procédures
peuvent effectuer des opérations sans nécessairement
renvoyer une valeur.
3
2019-2020 BASES DE DONNÉES
Qu'est-ce que la Programmation
Procédurale ?
Encapsulation de la Logique Métier : La programmation
procédurale permet d'encapsuler la logique métier
directement dans la base de données. Cela signifie que
vous pouvez définir des opérations complexes qui agissent
sur les données stockées dans la base de données sans
avoir à extraire ces données dans une application externe.
2019-2020 BASES DE DONNÉES
Qu'est-ce que la Programmation
Procédurale ?
Réutilisation du Code : Les fonctions et les procédures
stockées peuvent être réutilisées dans plusieurs requêtes
SQL, ce qui favorise la réutilisation du code et la réduction
de la redondance.
Séparation des Préoccupations : En utilisant la
programmation procédurale, vous pouvez séparer la
logique de traitement des données de la logique
d'application. Cela peut rendre le code SQL plus clair et
plus maintenable.
5
2019-2020 BASES DE DONNÉES
Qu'est-ce que la Programmation
Procédurale ?
Optimisation des Performances : Dans certains cas,
l'utilisation de routines procédurales peut permettre
d'optimiser les performances en minimisant les échanges
de données entre la base de données et l'application.
Gestion des Erreurs : Les routines procédurales en MySQL
peuvent gérer les erreurs et les exceptions de manière
appropriée, ce qui facilite la gestion des exceptions et des
comportements inattendus dans les requêtes SQL.
6
2019-2020 BASES DE DONNÉES
Définition d'une Fonction
Stockée :
Une fonction stockée en MySQL est une routine SQL qui
permet d'effectuer des opérations spécifiques sur les
données dans une base de données et de renvoyer un
résultat. Contrairement aux procédures stockées, les
fonctions stockées renvoient une valeur après leur
exécution. Elles sont similaires aux fonctions dans d'autres
langages de programmation et sont utilisées pour
encapsuler une logique de traitement des données
réutilisable.
7
2019-2020 BASES DE DONNÉES
Syntaxe pour Créer une
Fonction Stockée en MySQL :
La création d'une fonction stockée en MySQL suit une
syntaxe spécifique. Voici la structure générale :
USE nom_bd;
DROP FUNCTION IF EXISTS nom_fonction;
DELIMITER //
CREATE FUNCTION nom_de_la_fonction (paramètres)
RETURNS type_de_retour
déclaration informative
BEGIN
-- Corps de la fonction
END //
DELIMITER ;
8
2019-2020 BASES DE DONNÉES
Syntaxe pour Créer une
Fonction Stockée en MySQL :
❑ DELIMITER // : Cela définit le délimiteur pour la définition de la fonction. Cela
signifie que le code de la fonction sera encadré par // au lieu du point-virgule
habituel.
❑ nom_de_la_fonction : C'est le nom de la fonction que vous souhaitez créer.
❑ paramètres : Vous pouvez spécifier des paramètres d'entrée pour la fonction, qui
sont des valeurs passées à la fonction lors de son appel.
❑ type_de_retour : Indique le type de données que la fonction renverra après son
exécution.
❑ BEGIN et END : Ces balises définissent le début et la fin du corps de la fonction, où
vous écrivez les instructions SQL pour effectuer les opérations nécessaires.
9
2019-2020 BASES DE DONNÉES
Syntaxe pour Créer une
Fonction Stockée en MySQL :
La déclaration informative peut prendre l’une des valeurs:
❑ DETERMINISTIC : La fonction renverra les mêmes valeurs si les mêmes arguments
lui sont fournis, ce qui signifie qu’on connaisse toujours la sortie, compte tenu de
l'entrée ;
❑ READS SQL DATA : Spécifie si la fonction lira les données de la base de données
mais ne modifiera pas les données;
❑ MODIFIES SQL DATA : Spécifie si la fonction modifiera les données dans la base de
données;
❑ CONTAINS SQL : Spécifie si la fonction aura des instructions SQL mais elles ne lisent
ni ne modifient les données,
1
0
2019-2020 BASES DE DONNÉES
Exemple de Fonction
Stockée en MySQL :
Voici un exemple simple d'une fonction stockée en MySQL qui
calcule la somme de deux nombres passés en paramètres et
renvoie le résultat :
DELIMITER //
CREATE FUNCTION calculerSomme (a INT, b INT)
RETURNS INT
BEGIN
DECLARE resultat INT;
SET resultat = a + b;
RETURN resultat;
END //
DELIMITER ;
1
1
2019-2020 BASES DE DONNÉES
Exemple de Fonction
Stockée en MySQL :
Une fois que la fonction est créée, vous pouvez l'appeler dans
des requêtes SQL comme ceci :
SELECT calculerSomme(5, 7);
1
2
2019-2020 BASES DE DONNÉES
Exercice
1. créer la base de données GestionVente :
Créer la table produit (id, nom ,qte,prix,marque)
2. Créer la fonction afficherPrix(idproduit) permettant d'afficher le
prix d'un produit dont son id est passé en paramètre
3. Créer la fonction nombreProduit(marque) permettant d'afficher le
nombre de produit d'une marque passé en paramètre
4. Créer la fonction moyennePrixMarque(marque) permettant
d'afficher la moyenne des prix d'une marque passé en paramètre
Exercice 2
CREATE TABLE Livres ( CREATE TABLE Categories (
LivreID INT AUTO_INCREMENT PRIMARY KEY, CategorieID INT AUTO_INCREMENT PRIMARY KEY,
Titre VARCHAR(255), NomCategorie VARCHAR(255)
ISBN VARCHAR(13), );
AnneePublication INT,
CREATE TABLE Emprunts (
Prix DECIMAL(10, 2),
EmpruntID INT AUTO_INCREMENT PRIMARY KEY,
CategorieID INT,
ClientID INT,
FOREIGN KEY (CategorieID) REFERENCES Categories(CategorieID)
LivreID INT,
);
DateEmprunt DATE,
DateRetourPrevue DATE,
CREATE TABLE Auteurs (
FOREIGN KEY (ClientID) REFERENCES Clients(ClientID),
AuteurID INT AUTO_INCREMENT PRIMARY KEY,
NomAuteur VARCHAR(255),
FOREIGN KEY (LivreID) REFERENCES Livres(LivreID)
Nationalite VARCHAR(255) );
);
Exercice 2
1. Fonction stockée pour récupérer les détails d'un livre par son ID
2. Fonction stockée pour calculer le nombre total de livres empruntés
par un client donné
3. Fonction stockée pour obtenir le nombre total de livres dans une
catégorie donnée
Cours 4 : Les
procédures stockées
Gestion de données
Mme RIFAI Meriem
03/11/2025 BASES DE DONNÉES
Définition
Les procédures stockées permettent de stocker un
ensemble de requêtes SQL, à exécuter en cas de
besoin.
En règle générale, on doit utiliser des procédures
stockées lorsqu'une requête ou un ensemble de
requêtes doit être répété régulièrement.
03/11/2025 BASES DE DONNÉES
Définition
La procédure stockée peut contenir une instruction
conditionnelle telle que IF ou CASE ou les boucles.
La procédure stockée peut également exécuter une autre
procédure stockée ou une fonction qui modularise le
code.
Les procédures stockées sont idéales pour déplacer des
tâches de traitement lourdes vers le serveur MySQL.
3
03/11/2025 BASES DE DONNÉES
Syntaxe
DELIMITER $$
CREATE PROCEDURE
nom_procedure([paramètres])
BEGIN
le code SQL
END $$
DELIMITER ;
Syntaxe pour exécuter une procédures stockée
call nom_procedure([paramètres]);
4
03/11/2025 BASES DE DONNÉES
Syntaxe
DELIMITER $$
CREATE PROCEDURE sp_client_par_ville(IN ville VARCHAR(50))
BEGIN
SELECT *
FROM clients
WHERE UPPER(adresse) = UPPER(ville);
END $$
DELIMITE ;
- - Appel
call sp_client_par_ville (‘’agadir’’);
5
03/11/2025 BASES DE DONNÉES
Les procédures stockées MySQL ont trois directions dans lesquelles un paramètre peut être
défini:
IN
• La valeur est uniquement transmise à la procédure stockée. Elle est utilisée dans le cadre de la
procédure. Cela revient à fournir une entrée à la procédure stockée.
OUT
• La valeur est uniquement transmise hors de la procédure stockée ; toutes les variables externes
qui ont été affectées à cette position prendront la valeur transmise. Cela revient à renvoyer des
valeurs à partir d'une procédure stockée.
INOUT
• Une variable et sa valeur (ExtVal) sont transmises à la procédure stockée (IntVal) et peuvent y
être modifiées. Lorsque la procédure stockée est terminée, la valeur externe (ExtVal) sera égale à
la valeur modifiée (IntVal)
03/11/2025 BASES DE DONNÉES
Mode de passage de
paramètres IN
IN est le mode par défaut. Lorsque vous définissez un paramètre IN dans une
procédure stockée, le programme appelant doit passer un argument à la
procédure stockée. Cette argument est passé par valeur
DELIMITER $$
CREATE PROCEDURE sp_client_par_ville(IN ville VARCHAR(50))
BEGIN
SELECT *
FROM clients
WHERE UPPER(adresse) = UPPER(ville);
END $$
DELIMITER ;
- - Appel
call sp_client_par_ville (‘’agadir’’);
03/11/2025 BASES DE DONNÉES
Mode de passage de
paramètres OUT
Il s’agit d’un passage de paramètre en sortie (par référence). On passe
a la procédure stockée une variable de session dont la valeur peut être
modifiée à l'intérieur de la procédure stockée.
Notons que la procédure stockée ne peut pas accéder à la valeur
initiale du paramètre OUT lorsqu'elle démarre.
03/11/2025 BASES DE DONNÉES
Mode de passage de
paramètres out
DELIMITER $$
CREATE PROCEDURE sp_client_par_ville(IN ville VARCHAR(50),
OUT nombre_clients INT)
BEGIN
SELECT COUNT(*) INTO nombre_clients
FROM clients
WHERE UPPER(adresse) = UPPER(ville);
END $$
DELIMITER ;
- - Appel
CALL sp_client_par_ville (‘’agadir’’, @total); - - @total est une
variable de session
SELECT @total;
03/11/2025 BASES DE DONNÉES
Mode de passage de
paramètres INOUT
Un paramètre INOUT est une combinaison de paramètres IN et OUT.
Cela signifie que le programme appelant peut transmettre l'argument
et que la procédure stockée peut modifier le paramètre INOUT et
retransmettre la nouvelle valeur au programme appelant.
03/11/2025 BASES DE DONNÉES
Mode de passage de
paramètres INOUT
DELIMITER $$
CREATE PROCEDURE SetCounter (INOUT counter INT,
IN inc INT )
BEGIN
SET counter = counter + inc ;
END $$
DELIMITER ;
- - Appel
SET @counter = 1;
CALL SetCounter (@counter, 1); - - 2
CALL SetCounter (@counter, 1); - - 3
CALL SetCounter (@counter, 5); - - 8
SELECT @counter; - - 8
03/11/2025 BASES DE DONNÉES
Suppression d’une procédure
stockée
DROP PROCEDURE [IF EXISTS] nom_procedure_stockée ;
Pour modifier une procédure stockée on doit supprimer et recréer la
procédure stockée à l'aide des instructions
DROP PROCEDURE et CREATE PROCEDURE.
MySQL Workbench fournit un bon outil qui vous permet de modifier
rapidement une procédure stockée.
DROP PROCEDURE IF EXISTS SetCounter ;
03/11/2025 BASES DE DONNÉES
Liste des procédures stockées
SHOW PROCEDURE STATUS [LIKE 'pattern' | WHERE search_condition]
SHOW PROCEDURE STATUS ; - - affiche toutes les procédures stockées
SHOW PROCEDURE STATUS WHERE db = ‘eshop_app_db’ ; - - affiche toutes les
procédures stockées de la base de données eshop_app_db
SHOW PROCEDURE STATUS LIKE ‘%clients%’ ; - - affiche toutes les procédures
stockées dont le nom respecte le pattern
03/11/2025 BASES DE DONNÉES
Liste des procédures stockées
Liste des procédures stockées en utilisant la table routine
SELECT
routine_name
FROM
information_schema.routines
WHERE
routine_type = 'PROCEDURE’
AND routine_schema = ‘nom_base_donnees';
03/11/2025 BASES DE DONNÉES
Déclaration des variables
scalaires
DECLARE nomVariable1[,nomVariable2...] typeMySQL
[DEFAULT expression];
Lors des conflits potentiels de noms (variables ou colonnes) dans des
instructions SQL (principalement INSERT, UPDATE, DELETE et SELECT),
le nom de la variable est prioritairement interprété au détriment de la
colonne de la table (de même nom)
03/11/2025 BASES DE DONNÉES
Déclaration des variables
scalaires
DECLARE v_dateNaissance DATE;
DECLARE v_trouve BOOLEAN DEFAULT TRUE;
DECLARE v_Dans2jours DATE DEFAULT ADDDATE(SYSDATE(),2);
DECLARE i, j, k INT;
03/11/2025 BASES DE DONNÉES
Déclaration des variables de
session (externes)
Les variables dites de session (user-defined variables) sont déclarées à l’aide
du symbole « @ ». C’est une variable définie par un client qui n'est pas visible
par les autres clients. En d'autres termes, une variable définie par l'utilisateur
qui est spécifique à la session.
SET @nom_variable := valeur Ou SELECT @nom_variable := valeur
03/11/2025 BASES DE DONNÉES
Utilisation de INTO pour les
variables
a. Syntaxe avec des variables de session
Lorsque tu veux récupérer une ou plusieurs valeurs d'une requête SELECT et les stocker
dans des variables, voici la syntaxe :
SELECT column_name INTO @variable_name
FROM table_name
WHERE condition;
Select age into @var from personne where id=7
03/11/2025 BASES DE DONNÉES
Utilisation de INTO pour les
variables
b. Utilisation avec des variables locales dans une requête
Si tu travailles avec des variables locales dans une procédure stockée, tu pourrais
avoir un exemple comme :
DECLARE product_name VARCHAR(50);
DECLARE product_price DECIMAL(10,2);
SELECT name, price INTO product_name, product_price
FROM products
WHERE id = 1;
03/11/2025 BASES DE DONNÉES
Exercice pratique
-Déclarer une variable de session pour stocker le prix d'un produit.
-Utiliser une requête SELECT ... INTO pour affecter le prix d'un produit
spécifique à cette variable.
-Utiliser cette variable pour une autre requête (comme calculer la TVA).
TTVA = 20%
03/11/2025 BASES DE DONNÉES
Correction
-- 1. Initialisation de la variable de session pour le prix du produit
SET @product_price := 0;
-- 2. Récupérer le prix du produit dont l'identifiant est 1 et le stocker dans la variable
SELECT price INTO @product_price FROM products WHERE product_id = 1;
-- 3. Utiliser la variable pour calculer le prix avec TVA
SELECT @product_price AS 'Prix HT',
@product_price * 0.20 AS 'TVA',
@product_price * 1.20 AS 'Prix TTC';
03/11/2025 BASES DE DONNÉES
Exercice
Considérez les relations suivantes :
◦ Employe(nuempl:string, nomempl:string, hebdo: integer,salaire
integer)
◦ Service(nuserv:integer, nomserv:string, #chef:string)
◦ Projet(nuproj:integer, nomproj:string, #resp:string)
◦ Travail(#nuempl:string, #nuproj:integer, duree:integer)
03/11/2025 BASES DE DONNÉES
Exercice
- Écrire une procédure qui insère l’employé donné
- Écrire une procédure qui prend comme arguments un identifiant
d’employé et un nombre, puis mettre à jour le salaire de l’employé
donné avec le nombre donné.
- Écrire une procédure qui compte le nombre d’employés participant à
un projet donné.
- Écrire une procédure qui compte le nombre de projets supervisés par
les employés d’un service donné.
- Écrire une procédure qui compte le nombre de projets auxquels
participe l’employé donné.
- Écrire une procédure, qui compte le nombre d’employés qui prennent
en charge plus que le nombre de projets donné.
03/11/2025 BASES DE DONNÉES
Vous êtes développeurs dans une entreprise e-commerce.
Le directeur vous demande un rapport rapide sur les clients ayant effectué plus de 2
commandes cette semaine.
Vous avez les tables suivantes :
•client(idc, nom, prenom, ville)
•commande(id_cmd, idc, date_cmd, montant)
Vous devez :
1. Identifier les clients concernés
2. Calculer le total de leurs commandes
3. Et les afficher triés par total décroissant.
Comment feriez-vous cette analyse si vous deviez utiliser plusieurs
requêtes ? Où stockeriez-vous les résultats intermédiaires ?
03/11/2025 GESTION DE DONNÉES
Cours 2 : Les tables temporaires
Gestion de données
Mme RIFAI Meriem
03/11/2025 GESTION DE DONNÉES
Les tables temporaires
❑ Sont des tables ayant une durée de vie très
limitée.
❑ En effet, tout comme les variables utilisateur ou
les requêtes préparées, les tables temporaires
n'existent que dans la session qui les a créées.
❑ Dès que la session se termine (déconnexion
volontaire ou accidentelle), les tables
temporaires sont supprimées.
3
03/11/2025 GESTION DE DONNÉES
Principe, règles et
comportement
On l'a dit, une table temporaire est une table qui
n'existe que dans la session qui l'a créée. En dehors de
ça, c'est une table presque normale. On peut exécuter
sur ces tables toutes les opérations que l'on exécute
sur une table classique : insérer des données, les
modifier, les supprimer, et bien sûr les sélectionner.
03/11/2025 GESTION DE DONNÉES
Principe, règles et
comportement
En résumé, les tables temporaires sont utiles pour
gérer des données temporaires, stocker des résultats
intermédiaires, optimiser les performances des
requêtes complexes et garantir l'isolation des
données entre les sessions utilisateur. Elles sont
particulièrement utiles dans les environnements de
base de données où la gestion des données
temporaires est nécessaire pour des opérations
spécifiques.
03/11/2025 GESTION DE DONNÉES
Création
Pour créer une table temporaire, on peut utiliser
tout simplement CREATE TABLE en
ajoutant TEMPORARY, pour préciser qu'il s'agit
d'une table temporaire.
03/11/2025 GESTION DE DONNÉES
Exemple
C R E AT E T E M P O R A R Y TA B L E TMP_Animal (
id UNSIGNED PRIMARY KEY,
nom (30),
espece_id UNSIGNED,
sexe (1) );
C R E AT E T E M P O R A R Y TA B L E TMP_Animal AS
Select id,nom,pespece_id, sexe from animal;
Modification
Pour la modification, nul besoin du mot
clé TEMPORARY, on utilise directement ALTER
TABLE, comme s'il s'agissait d'une table normale.
03/11/2025 GESTION DE DONNÉES
Exemple
ajout d'une colonne à TMP_Animal.
ALTER TABLE TMP_Animal
ADD COLUMN date_naissance DATETIME;
Suppression
En ce qui concerne la suppression, on a le choix
d'ajouter TEMPORARY, ou non. Si TEMPORARY est
précisé, la table mentionnée ne sera supprimée que
s'il s'agit bien d'une table temporaire. Sans ce mot-
clé, on pourrait supprimer par erreur une table non
temporaire, en cas de confusion des noms des
tables par exemple.
1
0
03/11/2025 GESTION DE DONNÉES
Exemple
suppression de TMP_Animal, qui n'aura pas fait long feu.
DROP TEMPORARY TABLE TMP_Animal;
Utilisation des tables
temporaires
Une table temporaire s'utilise comme une table
normale. Les commandes d'insertion, modification et
suppression de données sont exactement les mêmes.
Notez que l'immense majorité des tables temporaires
étant créées pour stocker des données venant d'autres
tables, on utilise souvent INSERT INTO ... SELECT pour
l'insertion des données.
12
03/11/2025 GESTION DE DONNÉES
Insert into tmp_animal values select id,nom from animal
03/11/2025 GESTION DE DONNÉES
Contexte
Une banque en ligne gère les comptes de ses clients dans une base de
données MySQL.
Chaque compte est représenté dans la table suivante :
CREATE TABLE compte
( id_compte INT PRIMARY KEY,
nom_client VARCHAR(100),
solde DECIMAL(10,2) );
Un client souhaite effectuer un virement de 500 DH du
compte 1 vers le compte 2.
UPDATE compte SET solde = solde - 500
WHERE id_compte = 1;
UPDATE compte SET solde = solde + 500
WHERE id_compte = 2;
Les transactions en
MySQL
COMPRENDRE ET SÉCURISER LES OPÉRATIONS SUR
LES BASES DE DONNÉES
Objectifs de la séance
Comprendre ce qu’est une transaction
Identifier son utilité dans la gestion de données
Manipuler les commandes : START TRANSACTION,
COMMIT, ROLLBACK
Appliquer le concept ACID
Qu’est-ce qu’une transaction ?
Une transaction est un ensemble d’opérations SQL
exécutées comme une seule unité logique.
Toutes les opérations doivent réussir ou échouer
ensemble.
Soit tout est validé (COMMIT), soit tout est annulé
(ROLLBACK).
Pourquoi utiliser les transactions ?
Garantir l’intégrité des données
Éviter les incohérences lors d’erreurs ou de coupures
Exemple : transfert d’argent entre deux comptes
- Débit du compte A
- Crédit du compte B
- Si une étape échoue, il faut annuler l’ensemble
Syntaxe de base d’une
transaction
SET autocommit = 0;
START TRANSACTION; // begin
-- Exécuter plusieurs requêtes
UPDATE compte SET solde = solde - 100 WHERE id = 1;
UPDATE compte SET solde = solde + 100 WHERE id = 2;
COMMIT; -- ou ROLLBACK;
Select * from compte;
Les jalons (SAVEPOINT)
Les jalons permettent de revenir à un point précis
dans une transaction sans tout annuler.
Exemple :
SAVEPOINT etape1;
UPDATE compte SET solde= solde* 1.2;
ROLLBACK TO etape1; -- Annule seulement les
changements après etape1
Commandes non annulables
Certaines commandes sont validées
automatiquement (autocommit), comme :
• CREATE TABLE
• DROP TABLE
• ALTER TABLE
Elles provoquent un COMMIT implicite.
Les propriétés ACID
Atomicité : tout ou rien
Cohérence : la base reste dans un état valide
Isolation : les transactions n’interfèrent pas entre
elles
Durabilité : les changements validés sont
permanents
Bonnes pratiques
Désactiver l’autocommit pour mieux contrôler les validations
Toujours tester avec ROLLBACK avant de COMMIT
Isoler les transactions critiques
Utiliser les SAVEPOINT pour les étapes intermédiaires
Mise en pratique
1. Créer deux tables : compteA et compteB avec un champ
solde
2. Simuler un transfert d’argent avec START TRANSACTION
3. Provoquer une erreur volontaire et tester ROLLBACK
4. Ajouter un SAVEPOINT et tester ROLLBACK TO
Résumé de la séance
Les transactions permettent :
D’assurer la fiabilité des données
De contrôler la validation des opérations
De travailler selon les principes ACID
Une bonne utilisation des transactions = base de
données cohérente et fiable.
Exercice
BDD
create table Client (
id_client NOT NULL,
nom (255) NOT NULL,
nb_places_reservees NOT NULL,
solde NOT NULL,
primary key (id_client));
create table Spectacle (
id_spectacle NOT NULL,
nb_places_offertes NOT NULL,
nb_places_libres NOT NULL,
tarif (10,2) NOT NULL,
primary key (id_spectacle));
Objectif
On souhaite permettre à un client d’acheter des places pour un
spectacle.
Lorsqu’un client réserve N places pour un spectacle, le système doit :
1.Vérifier qu’il reste suffisamment de places libres.
2.Débiter le solde du client (prix = N × tarif).
[Link] à jour le nombre de places libres du spectacle.
[Link] le nombre de places réservées du client.
Cours 1 : Les vues
Gestion de données
Mme RIFAI Meriem
Les vues
❑ Les vues en deux mots : des tables
virtuelles
❑ Les vues en une phrase : une vue est
une table qui est le résultat d’une requête
(SELECT) à laquelle on a donné un nom
❑ Le nom d’une vue peut être utilisé partout
où on peut mettre le nom d’une table :
SELECT, UPDATE, DELETE, INSERT,
GRANT 2
2024-2025 BASES DE DONNÉES
Création d’une vue :
syntaxe
CREATE [OR REPLACE]
VIEW
nom-de-vue [(attr1, …, attrn)]
AS requête
[WITH CHECK OPTION]
2024-2025 BASES DE DONNÉES
CREATE OR REPLACE VIEW
Liste_employes
AS
Select [Link], [Link] as nomEMP, [Link], [Link] as
nomD
From employe E inner join Departement D
On E.dept_id=[Link]
[WITH CHECK OPTION]
CREATE OR REPLACE VIEW
Liste_stagiaires(numero,moyenne)
AS
Select numero,avg(note)
From stagiaire
[WITH CHECK OPTION]
CREATE OR REPLACE VIEW
Liste_stagiaires2(numero,groupe)
AS
Select numero, groupe_id
From stagiaire where groupe_id=2
Sans [WITH CHECK OPTION]
Insert into liste_stagiaires2 values (12,3) // fonctionne
Avec [WITH CHECK OPTION]
Insert into liste_stagiaires2 values (12,3) // fonctionne pas
Utilisation d’une vue : comme si
elle était une table
SELECT ...
FROM nom-de-vue
WHERE ...
2024-2025 BASES DE DONNÉES
Suppression d’une vue
DROP VIEW nom-de-vue
❑ La suppression d’une vue n’entraîne pas la
suppression des données
❑ Les vues figurent dans les tables
systèmes ALL_CATALOG,
USER_VIEWS et ALL_VIEWS
8
2024-2025 BASES DE DONNÉES
Renommer une vue
RENAME ancien-nom TO nouveau-nom
2024-2025 BASES DE DONNÉES
Quatre raisons d’utiliser
des vues
1) Effet macro : remplacer une requête
compliquée par des requêtes plus simples
2) Confidentialité
3) Contraintes d’intégrité
4) Augmenter l’indépendance
logique
2024-2025 BASES DE DONNÉES 10
1) Effet macro
❖ Remplacer une requête compliquée
par des requêtes plus simples
2024-2025 BASES DE DONNÉES 11
2) Confidentialité :
exemple
CREATE VIEWemprunteurRestreint
AS SELECT login, nomClient, prenomClient
FROMclient
2024-2025 BASES DE DONNÉES 12
3) Contraintes d’intégrité
(CHECK OPTION) : exemple
CREATE VIEWanciensExemplaires
AS SELECT * FROMExemplaire
WHERE numExemplaire < 2000
WITH CHECK OPTION;
UPDATE anciensExemplaires
SET numExemplaire = 3812
WHERE numExemplaire = 1318;
Sans'WITH CHECK OPTION', c’est possible.
Avec'WITH CHECK OPTION', c’est impossible.
2024-2025 BASES DE DONNÉES 13
4) Augmenter l’indépendance
logique
❖ Les applications utilisant les tables de
la base ne doivent pas être modifiées
si on change le schéma de la base
2024-2025 BASES DE DONNÉES 14
Exemple : vidéothèque
FILM EXEMPLAIRE LOCATION
numFilm numExemplaire numExemplaire
titre numFilm dateLocation
realisateur codeSupport login
vo dateEnvoi
probleme dateRetour
detailSupport
CLIENT
login
INDIVIDU nomClient
numIndividu prenomClient
nomIndividu motDePasse
prenomIndividu adresse
7
Exemple (2)
CREATE OR REPLACE VIEW
exemplairePlus (num, vo, titre, real, support)
AS SELECT numExemplaire, vo, titre,
nomIndividu, codesupport
FROMExemplaire E, Film F, Individu
WHERE [Link] = [Link]
AND realisateur = numIndividu
AND probleme IS NULL;
2024-2025 BASES DE DONNÉES 16
Exemple (3)
SELECT num, titre, dateLocation, login
FROMexemplairePlus, Location
WHERE num= numExemplaire
AND real = 'SAUTET'
AND dateRetour IS NULL;
2024-2025 BASES DE DONNÉES 17
Exemple (4)
INSERT INTO exemplairePlus (num, support)
VALUES (150346, 'DVD');
DROPVIEWexemplairePlus;
2024-2025 BASES DE DONNÉES 18
Conditions de mise à jour
pour les vues
❖ Pour UPDATE, DELETE, INSERT la vue ne doit pas contenir :
• Un opérateur ensembliste (UNION,
MINUS, INTERSECT)
• Un opérateur DISTINCT
• Une fonction d’agrégation comme attribut
• Une clause GROUP BY
• Une jointure (la vue doit être construite sur une
seule table)
2024-2025 BASES DE DONNÉES 19
Conditions de mise à jour
pour les vues (2)
❖ Pour UPDATE, DELETE, INSERT :
• Les colonnes résultats de l’ordre
SELECT doivent être des colonnes
réelles d’une table de la base et non des
expressions
• Si la vue est construite à partir d’une
autre vue, cette dernière doit elle-même
vérifier les conditions ci-dessus
2024-2025 BASES DE DONNÉES 20
Travail à faire:
Travail à faire:
[Link]éer la base de données EMPLOYES.
[Link]éez une vue V_EMP contenant : le matricule, le nom, le numéro de département, la
somme de la commission et du salaire nommé GAINS, le lieu du département.
3.Sélectionnez les lignes de V_EMP dont le salaire total est supérieur à 10.000
[Link] de mettre à jour le nom de l'employé de matricule 1 à travers la vue V_EMP.
[Link]éez une vue V_EMP10 qui ne contienne que les employés du département 10 de la table
EMP (n'utilisez pas l'option CHECK pour cette création). Insérez dans cette vue un employé
qui appartient au département 20.
Essayez ensuite de retrouver cet employé au moyen de la vue V_EMP10 puis au moyen de la
table EMP.
6.Détruisez cette vue VEMP10 et recréez-la avec l'option CHECK.
[Link] d'insérer un employé pour le département 30. Que se passe-t-il ? Essayez de
modifier le département d'un employé visualisé à l'aide de cette vue.
[Link] la liste des matricules, noms et salaires des employés avec le pourcentage par
rapport au total des salaires de leur département (utilisez une vue qui fournira le total des
salaires).