\. --TRUNCATE TABLE "Vente"; --TRUNCATE TABLE "Panier"; DROP PROCEDURE insertVente IF EXISTS CASCADE; CREATE PROCEDURE insertVente ( IN venteDate DATE , IN venteClient INTEGER , IN venteProduit INTEGER , IN venteQuantité DECIMAL ) MODIFIES SQL DATA BEGIN ATOMIC DECLARE panierID INTEGER DEFAULT NULL; DECLARE venteID INTEGER DEFAULT NULL; -- CorrectnessNote: seule la date et le client -- font partie des critères pour décider -- si le panier existe déjà où non. SET panierID = SELECT ID FROM "Panier" WHERE "Panier".date = venteDate AND "Panier".client = venteClient; IF panierID IS NULL THEN INSERT INTO "Panier"(date, client) VALUES (venteDate, venteClient); SET panierID = IDENTITY(); END IF; -- CorrectnessNote: la quantité ne fait pas partie des critères -- pour décider si la vente existe déjà ou non. SET venteID = SELECT ID FROM "Vente" WHERE "Vente".panier = panierID AND "Vente".produit = venteProduit; IF venteID IS NULL THEN INSERT INTO "Vente"(panier, produit, quantité) VALUES (panierID, venteProduit, venteQuantité); END IF; END .; DROP PROCEDURE insertVentesParAbonnement IF EXISTS; CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE) MODIFIES SQL DATA BEGIN ATOMIC -- ExplanationNote: gère chaque jour l'un après l'autre. for_days: FOR SELECT day FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY)) WITH ORDINALITY as T(day, I) DO -- ExplanationNote: pour un jour donné, -- gère chaque abonnement l'un après l'autre. for_abos: FOR SELECT ID as aboID , client as aboClient , produit as aboProduit , quantité as aboQuantité , période as aboP FROM "Abonnement" JOIN "Période" ON "Période".ID = "Abonnement".période AND "Période".nom = DAYNAME(day) DO CALL insertVente(day, aboClient, aboProduit, aboQuantité); END FOR for_abos; END FOR for_days; END; .; CALL insertVentesParAbonnement(DATE '2025-04-07' + 7 DAY); \i sql/show.sql --call prix_à_date(CURRENT_DATE); select "Prod".nom_complet, date, euros from table (prix_à_date(CURRENT_DATE)) as PD join table (choisirUnProduit()) as "Prod" ON "Prod".ID = produit ;