Le PL/SQL est un langage de programmation impératif classique disponible dans la plupart des SGBD-R.
Ce type de programme est très interessant pour :
<aside>
⚠️ Si problème :SET GLOBAL log_bin_trust_function_creators = 1;
</aside>
-- Création de la table utilisateurs
DROP TABLE IF EXISTS utilisateurs;
CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
age INT,
majeur INT
);
DROP PROCEDURE IF EXISTS AjouterUtilisateur;
-- Création de la procédure stockée
DELIMITER //
CREATE PROCEDURE AjouterUtilisateur(IN nom_utilisateur VARCHAR(50), IN age_utilisateur INT)
BEGIN
INSERT INTO utilisateurs (nom, age) VALUES (nom_utilisateur, age_utilisateur);
END //
DELIMITER ;
-- Appel de la procédure
CALL AjouterUtilisateur('John Doe', 25);
CALL AjouterUtilisateur('Jane Doe', 30);
-- Affichage du contenu de la table utilisateurs
SELECT * FROM utilisateurs;
-- Création de la fonction
DELIMITER //
CREATE FUNCTION CalculerMoyenne(a INT, b INT)
RETURNS DECIMAL(5,2)
BEGIN
DECLARE moyenne DECIMAL(5,2);
SET moyenne = (a + b) / 2;
RETURN moyenne;
END //
DELIMITER ;
-- Utilisation de la fonction
SELECT CalculerMoyenne(10, 20) AS MoyenneSet1;
SELECT CalculerMoyenne(5, 16.3333) AS MoyenneSet2;
DROP FUNCTION IF EXISTS CalculerMoyenne;
DROP PROCEDURE IF EXISTS MiseAJourAge;
-- Création de la procédure
DELIMITER //
CREATE PROCEDURE MiseAJourAge(IN age_utilisateur INT)
BEGIN
IF age_utilisateur >= 18 THEN
SELECT 'Majeur' AS Statut;
ELSE
SELECT 'Mineur' AS Statut;
END IF;
END //
DELIMITER ;
-- Appel de la procédure
CALL MiseAJourAge(20);
CALL MiseAJourAge(15);
-- Création de la table
DROP TABLE IF EXISTS nombres;
CREATE TABLE nombres (
valeur INT
);
DROP PROCEDURE IF EXISTS RemplirNombres;
-- Insertion des valeurs de 1 à 10
DELIMITER //
CREATE PROCEDURE RemplirNombres()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 10 DO
INSERT INTO nombres (valeur) VALUES (i);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
-- Appel de la procédure
CALL RemplirNombres();
-- Affichage du contenu de la table
SELECT * FROM nombres;
-- Création de la table historique_utilisateurs
DROP TABLE IF EXISTS historique_utilisateurs;
CREATE TABLE historique_utilisateurs (
id_utilisateur INT AUTO_INCREMENT PRIMARY KEY,
nom_utilisateur VARCHAR(50),
action VARCHAR(50)
);
DROP TRIGGER IF EXISTS after_insert_utilisateur;
-- Création du déclencheur
DELIMITER //
CREATE TRIGGER after_insert_utilisateur
AFTER INSERT ON utilisateurs
FOR EACH ROW
BEGIN
INSERT INTO historique_utilisateurs (id_utilisateur, nom_utilisateur, action)
VALUES (NEW.id, NEW.nom, 'Ajout');
END //
DELIMITER ;
-- Ajout d'un utilisateur pour déclencher le déclencheur
INSERT INTO utilisateurs (nom, age) VALUES ('lionel', 28);
-- Affichage du contenu de la table historique_utilisateurs
SELECT * FROM historique_utilisateurs;
SELECT * FROM utilisateurs;
DROP PROCEDURE IF EXISTS testUtilisateurs ;
DELIMITER //
CREATE PROCEDURE testUtilisateurs()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE b CHAR(50);
DECLARE a INT;
DECLARE c INT;
DECLARE d INT;
DECLARE cur1 CURSOR FOR SELECT id,nom,age, majeur FROM utilisateurs;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO a, b, c ,d;
IF done THEN
LEAVE read_loop;
END IF;
SELECT a,b,c,d ; -- affichage
END LOOP;
CLOSE cur1;
END //
DELIMITER ;
Explication :