-- -----------------------------------------------------
-- TABLE COMPOSANT
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS COMPOSANT
(
EnsembleId VARCHAR(10) NOT NULL,
EnsembleParent VARCHAR(10) NOT NULL,
Quantite INT NOT NULL,
PRIMARY KEY (EnsembleId, EnsembleParent)
) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('rivet', 'longeron', 10) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('rivet', 'aileron', 5) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('rivet', 'aile', 100) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('rivet', 'charnière', 4) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('rivet', 'train', 8) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('aileron', 'aile', 1) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('charnière', 'aileron', 2) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('charnière', 'train', 3) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('longeron', 'aile', 5) ;
INSERT INTO COMPOSANT (EnsembleId, EnsembleParent, Quantite) VALUES ('train', 'aile', 1) ;
SELECT * FROM COMPOSANT ;
-- -----------------------------------------------------
-- TABLE PILE - Simulation de la jointure récursive
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS PILE
(
PileId INT NOT NULL AUTO_INCREMENT,
Niveau INT NOT NULL,
EnsembleId VARCHAR(10) NOT NULL,
Quantite INT NOT NULL
, PRIMARY KEY (PileId)
) ;
COMMIT ;
DROP PROCEDURE IF EXISTS RecursonsJoyeusement ;
DELIMITER GO
CREATE PROCEDURE RecursonsJoyeusement
(
IN Amorce BOOLEAN, EnsembleIdIn VARCHAR(10),
OUT totalOut INT
)
BEGIN
DECLARE theEnsembleId VARCHAR(10) DEFAULT NULL ;
DECLARE theNiveau INT DEFAULT 0;
DECLARE Kount INT ;
SET theNiveau = (SELECT DISTINCT coalesce (MAX(Niveau) + 1, 1) FROM PILE) ;
IF Amorce = true
THEN
INSERT INTO PILE (EnsembleId, Quantite, Niveau)
SELECT EnsembleId, Quantite, TheNiveau
FROM COMPOSANT
WHERE Ensembleparent = EnsembleIdiN ;
SET totalOut = 0 ;
CALL RecursonsJoyeusement(false, '', totalOut) ;
ELSE
SET Kount = (SELECT COUNT(*)
FROM (SELECT x.EnsembleId, x.Quantite, Niveau
FROM COMPOSANT AS x INNER JOIN PILE AS y
ON x.Ensembleparent = y.EnsembleId
WHERE Niveau = TheNiveau - 1) as truc) ;
IF Kount > 0 THEN
INSERT INTO PILE (EnsembleId, Quantite, Niveau)
SELECT x.EnsembleId, x.Quantite * y.Quantite, TheNiveau
FROM COMPOSANT AS x INNER JOIN PILE AS y ON x.Ensembleparent = y.EnsembleId
WHERE Niveau = TheNiveau - 1 ;
CALL RecursonsJoyeusement(false, '', totalOut);
END IF ;
SET totalOut = (SELECT SUM(Quantite) FROM PILE WHERE EnsembleId = 'rivet') ;
END IF;
END
GO
DELIMITER ;
SET @@GLOBAL.max_sp_recursion_depth = 4;
SET @@session.max_sp_recursion_depth = 4;
SET @entree := 'aile' ;
SET @Amorce := true ;
CALL RecursonsJoyeusement(@Amorce, @entree, @total);
SELECT 'Le grand total des rivets de ', @entree, ' : ', @total;
Comme dans l'exemple de Chamberlin, le nombre de rivets utilisés pour une aile d'avion est toujours égal à 183...
Partager