1. Procédure sp_Mise_A_Jour_Prix_Produit
Cette procédure met à jour le prix unitaire d’un produit donné.


CREATE OR REPLACE PROCEDURE sp_Mise_A_Jour_Prix_Produit(
    Nom_Produit VARCHAR2,
    Nouveau_Prix_Unitaire NUMBER
) AS
BEGIN
    -- Vérification si le produit existe
    IF NOT EXISTS (SELECT 1 FROM Produit WHERE nom_produit = Nom_Produit) THEN
        RAISE_APPLICATION_ERROR(-20001, 'Produit inexistant.');
    END IF;

    -- Mise à jour du prix unitaire
    UPDATE Produit
    SET prix_unitaire = Nouveau_Prix_Unitaire
    WHERE nom_produit = Nom_Produit;

    DBMS_OUTPUT.PUT_LINE('Le prix du produit ' || Nom_Produit || ' a été mis à jour.');
END;
/




2. Fonction fn_quantité_moyenne
Cette fonction retourne la moyenne des quantités commandées pour un produit donné.


CREATE OR REPLACE FUNCTION fn_quantite_moyenne(
    nom_produit VARCHAR2
) RETURN NUMBER AS
    moyenne_quantite NUMBER;
BEGIN
    -- Vérification si le produit existe
    IF NOT EXISTS (SELECT 1 FROM Produit WHERE nom_produit = nom_produit) THEN
        RAISE_APPLICATION_ERROR(-20002, 'Produit inexistant.');
    END IF;

    -- Calcul de la moyenne des quantités commandées
    SELECT AVG(quantite)
    INTO moyenne_quantite
    FROM ligne_commande
    WHERE produit_id = (SELECT id FROM Produit WHERE nom_produit = nom_produit);

    RETURN moyenne_quantite;
END;
/




3. Procédure sp_DateDernierAchat
Cette procédure affiche la dernière date d'achat d’un produit donné.


CREATE OR REPLACE PROCEDURE sp_DateDernierAchat(
    Nom_Produit VARCHAR2
) AS
    derniere_date DATE;
BEGIN
    -- Vérification si le produit existe
    IF NOT EXISTS (SELECT 1 FROM Produit WHERE nom_produit = Nom_Produit) THEN
        RAISE_APPLICATION_ERROR(-20003, 'Produit inexistant.');
    END IF;

    -- Récupération de la dernière date d'achat
    SELECT MAX(date_achat)
    INTO derniere_date
    FROM Commande c
    JOIN ligne_commande lc ON c.id = lc.commande_id
    WHERE lc.produit_id = (SELECT id FROM Produit WHERE nom_produit = Nom_Produit);

    DBMS_OUTPUT.PUT_LINE('Le produit ' || Nom_Produit || ' a pour dernière date d''achat : ' || derniere_date);
END;
/




4. Ajouter la colonne quantite_en_stock dans la table Produit
Requête pour ajouter la colonne et l'initialiser avec une valeur par défaut :


ALTER TABLE Produit ADD quantite_en_stock NUMBER DEFAULT 0;

-- Initialisation des valeurs de stock (exemple : 100 pour tous les produits)
UPDATE Produit SET quantite_en_stock = 100 WHERE quantite_en_stock = 0;




5. Trigger trg_GestionStock
Ce trigger vérifie que la quantité commandée est inférieure ou égale au stock disponible avant d’ajouter une ligne de commande.


CREATE OR REPLACE TRIGGER trg_GestionStock
BEFORE INSERT ON ligne_commande
FOR EACH ROW
DECLARE
    v_stock_disponible NUMBER;
BEGIN
    -- Vérifier le stock disponible pour le produit
    SELECT quantite_en_stock
    INTO v_stock_disponible
    FROM Produit
    WHERE id = :NEW.produit_id;

    IF :NEW.quantite > v_stock_disponible THEN
        RAISE_APPLICATION_ERROR(-20004, 'Quantité commandée supérieure au stock disponible.');
    END IF;

    -- Mise à jour du stock
    UPDATE Produit
    SET quantite_en_stock = quantite_en_stock - :NEW.quantite
    WHERE id = :NEW.produit_id;
END;
/




Résumé des solutions :

1. Procédure sp_Mise_A_Jour_Prix_Produit : Met à jour le prix unitaire d’un produit.
2. Fonction fn_quantité_moyenne : Retourne la moyenne des quantités commandées d’un produit.
3. Procédure sp_DateDernierAchat : Affiche la dernière date d’achat d’un produit.
4. Ajout de la colonne quantite_en_stock : Permet de gérer les stocks des produits.
5. Trigger trg_GestionStock : Vérifie et met à jour le stock avant insertion dans ligne_commande.