Bonsoir,
Envoyé par
enshy2000
4: là, aucune idée
Une fonction renvoie explicitement une valeur, c’est sa finalité ! Exemple y=f(x). en revanche, une procédure est appelée explicitement par CALL (ou EXECUTE, etc.), et n’est pas astreinte à renvoyer une valeur, et si elle le fait c’est via un paramètre. Pour que les choses vous paraissent moins glauques, voyez la réponse faite à mehdi.rochdi dans laquelle une fonction appelle ... une procédure (SGBD : SQL Server) :
On cherche les gains d’un certain FR-NAUF-456 , calculables par la fonction CalculGainTotalMembre :
J’extraie ceci du post correspondant :
Mise en oeuvre de la fonction :
SELECT CalculGainTotalMembre ('FR-NAUF-456')
La fonction elle-même :
CREATE FUNCTION CalculGainTotalMembre (LeMembreCode CHAR(11))
RETURNS DECIMAL(5,2)
BEGIN
DECLARE theGain INT default 0 ;
DELETE FROM PILE ;
CALL RecursonsJoyeusement(true, LeMembreCode, theGain) ;
RETURN (SELECT SUM(Gain) FROM PILE) ;
END
La procédure appelée par la fonction :
CREATE PROCEDURE RecursonsJoyeusement
@theMembreCode AS CHAR(11)
, @Gain AS INT OUTPUT
AS
;
WITH COMPOSITION_VUE (MembreId, ParrainId, Souscription, LeNiveau, Gain) AS
((SELECT x.MembreId, x.ParrainId, z.Souscription, 1, z.Souscription * (SELECT POURCENTAGE FROM POURCENTAGE WHERE Niveau = 1)
FROM PARRAINAGE AS x JOIN MEMBRE AS y ON x.ParrainId = y.MembreId
JOIN PACK AS z ON y.PackId = z.PackId
WHERE y.MembreCode = @theMembreCode)
UNION ALL
(SELECT y.MembreId, y.ParrainId, x.Souscription, x.LeNiveau + 1
, CASE LeNiveau + 1
WHEN 2 THEN x.Souscription * (SELECT POURCENTAGE FROM POURCENTAGE WHERE Niveau = 2)
WHEN 3 THEN x.Souscription * (SELECT POURCENTAGE FROM POURCENTAGE WHERE Niveau = 3)
WHEN 4 THEN x.Souscription * (SELECT POURCENTAGE FROM POURCENTAGE WHERE Niveau = 4)
ELSE 0
END
FROM COMPOSITION_VUE AS x JOIN PARRAINAGE AS y
ON x.MembreId = y.ParrainId))
INSERT INTO PILE (MembreId, ParrainId, Niveau, Gain) SELECT MembreId, ParrainId, LeNiveau, Gain FROM COMPOSITION_VUE
;
SET @Gain = (SELECT SUM(Gain) FROM PILE) ;
Version MySQL (qui ne connaît pas la jointure récursive utilisée dans la procédure) : voir plus loin.
Je pense que désormais vous devriez pouvoir répondre au point 4...
Envoyé par
enshy2000
5: j'ai envie de mettre D, une base de données peut être réseau aussi (internet)
Non. Comme dit escartefigue, le qualificatif « réseau » appliqué aux bases de données concerne une classe de SGBD prérelationnels plus ou moins conformes à la norme Codasyl, dont les plus connus furent IDS, IDS/2, IDMS, TOTAL (dont j’ai eu le bonheur de réécrire complètement le moteur en 1976, pour le compte d’un banquier qui le trouvait trop lent...). A l’époque, étaient en vogue les bases de type « réseau », « hiérarchique » (par exemple IMS d’IBM, toujours actif), « liste inverse » (Datacom/DB, Adabas).
Envoyé par
enshy2000
6: la pour moi A,B,C sont possible alors que 2 réponses au plus est possible pour la question, donc plutôt A et C !
Le point a : d’accord, même si cela va infiniment plus loin que ce qu’affirme le robot...
Le point b : d’accord, car du temps des SGBD prérelationnels, il fallait plus de 60 instructions pour traiter une requête qui en relationnel n’en nécessite qu’une ou deux... Je vous renvoie à The Database Relational Model, à la page 109.
Le point d : bien que le robot soit maladroit une fois de plus dans sa rédaction, d’accord, dans la mesure où il s’agit du respect de la 12e des 12 règles caractérisant les bases de données distribuées : le système distribué idéal doit garantir l’indépendance des SGBD, autrement dit, l’utilisateur n’a pas à savoir s’il tourne sur tel ou tel SGBD qui collabore sous le capot avec tel ou tel autre SGBD (cf. An Introduction to Database Systems, Eight Edition de C.J. Date, à la page 659). J’espère que le robot a lu Date...
Décidemment, le père du robot manque de rigueur...
Et n'oubliez pas de cliquer sur le pouce vert pour les réponses qui ont pu vous apporter des lueurs...
Partager