\p CREATE TABLE Prix CREATE CACHED TABLE "Prix" ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL , date DATE DEFAULT CURRENT_DATE NOT NULL , produit INTEGER NOT NULL , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL , CONSTRAINT "PK_Prix" PRIMARY KEY(ID) , CONSTRAINT "FK_Prix_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID) ON UPDATE CASCADE , CONSTRAINT "La combinaison (produit, date) d'un prix doit être unique" UNIQUE (produit, date) ); DROP FUNCTION produit_maxdate IF EXISTS CASCADE; CREATE FUNCTION produit_maxdate(IN at_date DATE) RETURNS TABLE(produit INTEGER, max_date DATE) READS SQL DATA BEGIN ATOMIC RETURN TABLE (SELECT "Produit".ID as produit , MAX( date ) as max_date FROM "Prix" JOIN "Produit" ON "Produit".ID = "Prix".produit WHERE date <= at_date GROUP BY "Produit".ID ); END; .; DROP FUNCTION prix_à_date IF EXISTS CASCADE; CREATE FUNCTION prix_à_date(IN at_date DATE) RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL) READS SQL DATA BEGIN ATOMIC RETURN TABLE (SELECT produit, date, euros FROM TABLE (produit_maxdate(at_date)) as P JOIN "Prix" ON "Prix".produit = P.produit AND "Prix".date = P.max_date ); END; .;