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>

Procédure classique

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

Fonction

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

Condition

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

Boucle

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

Trigger

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

Curseur

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 :

4. Déclaration des variables