Les Fonctions

Les fonctions stockées (ou procédures stockées) dans MySQL sont des objets de base de données qui encapsulent un ensemble d'instructions SQL pour effectuer des opérations spécifiques.
Ces fonctions sont enregistrées dans la base de données et peuvent être invoquées à partir de requêtes SQL, d'autres procédures stockées ou d'applications externes.
Définition des fonctions stockées :
Une fonction stockée est une routine qui accepte des paramètres en entrée, effectue des opérations sur ces paramètres, puis renvoie un résultat.
Les fonctions stockées sont créées dans la base de données avec un nom unique et peuvent être invoquées à partir de n'importe quel endroit où vous exécutez des requêtes SQL.
syntaxe:
delimiter //
 Create function NomFonction (paramter 1 type1,parameter 2 type 2,....)
 returns typeRetour
 DETERMINISTIC
 begin
    les instructions :
	   select , if , else ,for ...
 end;

Explications

delimiter //
un symbole (// ,$$ ,££) pemert de spécifier le debut du code de la fonction
parce que une fonction contient plusieurs instructions
select ...from ;
declare x int ;
.....;
alors que le séparateur par défaut des instructions dans sql est ;
Mais toutes les instructions d'une fonction représente une seul commande (instruction) à éxécuter,
Donc on doit changer le type du delimiter ; pour rendre tout le code aprés create function ..; comme une seul instruction
Create function NomFonction(paramter 1 type1,parameter 2 type 2,....)
Permet de créer la fonction NomFonction avec les paramètre de types: a int ,b float , age int....
on peut aussi utiliser:
create function  if not exits NomFonction(paramter 1 type1,parameter 2 type 2,....)
returns typeRetour
les fonction doivent retourner une valeur alors on doit spécifier le type de cette valeur
return int
return varchar(50)
return text
return date
return table
....
DETERMINISTIC
DETERMINISTIC :fixer la valeur de retour de la fonction ,
meme si les données dans la base de données sont changé pour les meme paramètres
Not DETERMINISTIC :la valeur de retour change si les données dans la base de données sont changées

Remarque

DETERMINISTIC n'est pas obligatoire
si on précise pas DETERMINISTIC mysql applique automatiquent NOT DETERMINISTIC
begin
le début de la fonction
Les instructions de la fonction ,declar , if , else , for , ....
end;
la fin de la fonction

Remarque

les fonctions doivente être créer dans une database, donc il faut se connecté à une base de données avant de commencer à créer les fonctions

Exemples

Exemple1

créer une fonction qui permet de calculer le produit de deux entier a , et b
delimiter //
create function if not exits calcul(a int , b int)
returns int
begin
return (a*b);
end;

Remarque

Afin d'appler une fonction on utilise :
select calcul(5,10)
Exemple2
-- Crée une nouvelle fonction nommée "addition"
CREATE FUNCTION addition(a INT, b INT)
-- Indique que la fonction renverra un entier
RETURNS INT
-- La fonction est déterministe, elle renverra la même valeur pour les mêmes entrées
DETERMINISTIC
-- Description de la fonction
** 'Cette fonction calcule la somme de deux nombres.'
BEGIN
    -- Déclaration d'une variable locale "result" pour stocker le résultat
    DECLARE result INT;
    
    -- Calcul de la somme des deux nombres
    SET result = a + b;
    
    -- Renvoie le résultat
    RETURN result;
END;
Exemple3
-- Crée une nouvelle fonction nommée "calculer_moyenne_notes"
CREATE FUNCTION calculer_moyenne_notes(etudiant_id INT)
-- Indique que la fonction renverra un réel (décimal)
RETURNS DECIMAL(5,2)
-- Description de la fonction
-- 'Calcule la moyenne des notes pour un étudiant donné.'
BEGIN
    -- Déclare une variable locale "moyenne" pour stocker la moyenne des notes
    DECLARE moyenne DECIMAL(5,2);
    
    -- Calcule la moyenne en utilisant une requête SQL
    SELECT AVG(note) INTO moyenne
    FROM notes
    WHERE notes.etudiant_id = etudiant_id;
    
    -- Renvoie la moyenne des notes
    RETURN moyenne;
END;
Exemple4
créer la base de données GestionVente :
Créer la table produit (id, nom ,qte,prix,marque)
create database gestionVente;
use gestionVente;
create table produit(id int primary key  auto_increment,
nom varchar(25),
qte float default 0,
prix float ,
marque varchar(25)
) 
Créer la fonction afficherPrix(idproduit) permettant d'afficher le prix d'un produit dont son id est passé en paramètre
delimiter //
create function if not exists afficherPrix(idProduit int)
returns float
begin
return (select prix from produit where id=idproduit);
end
Créer la fonction nombreProduit(marque) permettant d'afficher le nombre de produit d'une marque passé en paramètre
delimiter //
create function if not exists nombreProduit(marqueProduit varchar(25))
returns int
begin
return (select count(*) from produit where marque=marqueProduit);
end;
Créer la fonction moyennePrixMarque(marque) permettant d'afficher la moyenne des prix d'une marque passé en paramètre
delimiter //
create function if not exists moyennePrixMarque(marqueProduit varchar(25))
returns float
begin
return (select avg(prix) from produit where marque=marqueProduit);
end;

Remarque

afin de supprimer une fonction déjà crée on utilise:
DROP FUNCTION IF EXISTS nomFonction
Remarque
Mysql n'est sensible à la case:
(les variables, fonctions, les tables ...)
s'écrit en majuscule ou en minuscule disent la meme chose:
create function if not exists fonction1().....
ou
Create FUNCTION iF nOt eXists Fronction1()
Crée une nouvelle fonction nommée "calculer_cout_total"
-- Crée une nouvelle fonction nommée "calculer_cout_total"
CREATE FUNCTION calculer_cout_total(
    produit_id INT,
    quantite INT,
    remise DECIMAL(5, 2)
)
-- Indique que la fonction renverra un décimal
RETURNS DECIMAL(10, 2)
-- 'Calcule le coût total d\'un achat en tenant compte de la remise.'
BEGIN
    -- Déclare une variable locale "cout" pour stocker le coût total
    DECLARE cout DECIMAL(10, 2);
    
    -- Calcule le prix du produit en fonction de la quantité
    DECLARE prix_produit DECIMAL(10, 2);
    SELECT prix INTO prix_produit FROM produits WHERE id = produit_id;
    
    -- Calcule le coût sans remise
    SET cout = prix_produit * quantite;
    
    -- Applique la remise si elle est supérieure à zéro
    IF remise > 0 THEN
        SET cout = cout - (cout * remise);
    ELSEIF remise < 0 THEN
        -- Si la remise est négative, ne pas appliquer de réduction
    ELSE
        -- Si la remise est nulle, ne pas appliquer de réduction
    END IF;
    
    -- Renvoie le coût total
    RETURN cout;
END;
Crée une nouvelle fonction nommée "calculer_taxe_vente"

CREATE FUNCTION calculer_taxe_vente(produit_id INT, taux_taxe DECIMAL(5, 2))
-- Indique que la fonction renverra un décimal
RETURNS DECIMAL(10, 2)
-- La fonction est déterministe, elle renverra la même valeur pour les mêmes entrées
COMMENT 'Calcule la taxe de vente pour un produit en fonction du taux de taxe spécifié.'
BEGIN
    -- Déclare une variable locale "taxe" pour stocker le montant de la taxe
    DECLARE taxe DECIMAL(10, 2);
    
    -- Calcule le prix du produit en fonction de l'ID du produit
    DECLARE prix_produit DECIMAL(10, 2);
    SELECT prix INTO prix_produit FROM produits WHERE id = produit_id;
    
    -- Calcule la taxe de vente en fonction du taux de taxe
    SET taxe = prix_produit * taux_taxe;
    
    -- Renvoie le montant de la taxe de vente
    RETURN taxe;
END;