130 lines
3.8 KiB
Plaintext
130 lines
3.8 KiB
Plaintext
|
|
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.
|