Bonjour,
Je voudrais savoir si DB2 offre la possibilité de faire de la récursivité avec une procédure(ou une fonction)?
Je suis sous AS400
Merci à tous
Bonjour,
Je voudrais savoir si DB2 offre la possibilité de faire de la récursivité avec une procédure(ou une fonction)?
Je suis sous AS400
Merci à tous
Oui tu peux faire de la récursivité.
La je n'ai pas le temps de t'expliquer mais je t'envoi un exmple demain si cela t'interesse.
Par contre je dois vérifier si c'est dispo pour l'AS400.
Merci jab pour ta réponse merci oui je veu bien une explication kan tu aura le temps
Je me suis peut être un peu avançé car j'ai lu trop rapidement ta question.
Oui DB2 permet la récursivité dans une procédure mais j'avoue je n'ai jamais essayé.
Sinon, il y a le SQL récursif. C'est ce que j'avais à l'esprit en te répondant.
Que cherches tu à faire ?
En fait ce que je voudrais faire c'est que ma fonction puisse se rapelé elle même.
Car en fait lorsque j'ai un article, celui ci possède des composants et pour chaque article je dois verifier une propriété du composant donc je dois rapeller la même fonction en boucle jusqu'à ce qu'il n'y ait plus de composant
Je pense que tu peux le faire mais tu peux aussi utiliser le recursive SQL, il te permettra de récupéré le résultat comme s'il venait d'un seul SELECT avec le composé et tout ses composant. C'est justement pour faire cela que cette commande existe et je pense que c'est beaucoup plus rapide qu'avec une procédure récursive.
Tu as un exemple à cette page.
http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0000879.htm?resultof=%22%73%65%6c%65%63%74%22%20%22%6d%61%69%6e%22%20%22%63%68%69%6c%64%22%20%22%70%61%72%65%6e%74%22%20
Merci jab mais je ne pense pas que je vais utilisé ça! Mais merci quand même c'est très intérréssant.
Je voudrais savoir comment faire pour :
- executer une procédure qui possède un paramètre IN et un paramètre OUT?
Mais on met quoi à la place des ??????
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 maproc(IN var1 integer,OUT var2 IN) CALL maproc(5,?????)
-comment appeler une procédure à partir d'une autre procédure?
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CALL maproc(num_art) ou CALL QSYS/QCMDEXC('CALL maproc(num_art)')
Pour ceux qui aurait le même problème j'ai expliquer mes recherches sur ce topic :
http://www.developpez.net/forums/vie...661549#2661549
Cette solution m'interresserait bien, mais j'ai un peu de mal à tout saisir. Si quelqu'un pouvait m'eclaicir sur le sujet. Car j'aurais besoin de faire de la recursivité et cette solution me parait pratique.Envoyé par jab
Explique ce que gu veux faire. si tu as déjà fait un bou de code donne le aussi. Ce sera plus fcile pour donner une explication sur un cas concret.
Pour l'instant, le seul code que j'ai pu produire est une suite de boucles imbriquées, qui, à mon avis, n'est ni performant, ni esthétique, ni facile à relire, etc...
Je vais tenter d'expliquer ce que je dois essayer de faire. Je possede une table contenant un certain nombres d'enregistrements sous cette forme:
ensemble | sous ensemble
-------------------------
2110 | 2134
2110 | 2135
2110 | 2136
2134 | 2137
2135 | 2150
2136 | 2151
Ce que je voudrais trouver, c'est le nombre de sous ensembles qui compose un ensemble, sachant bien evidement, qu'un sous ensemble, est aussi un ensemble. Je ne sais pas si la methode avec WITH peut repondre a cette problematique. Les requetes imbriquées marchent, et je vais essayé de rechercher un peu du coté de la recursivité...
Bon à tester convenablement mais si j'ai bien compri cela devrait convenir
[MODE EDIT]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 WITH TEMP (ensemble, sousensemble) AS ( SELECT main.ensemble, main.sousensemble FROM test.recettes main UNION ALL SELECT parent.ensemble, enfant.sousensemble FROM TEMP parent, test.recettes enfant WHERE parent.sousensemble = enfant.ensemble ) SELECT ensemble, count(*) FROM TEMP GROUP BY ensemble
Le même mais avec un contrôle sur le nombre de niveau maximum pour éviter une boucle infinie par exemple. J'ai mis 10 mais à toi de voir selon le nombre réelle maximum de niveau.
[/MODE EDIT]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 WITH TEMP (level,ensemble, sousensemble) AS ( SELECT 0,main.ensemble, main.sousensemble FROM test.recettes main UNION ALL SELECT parent.level+1,parent.ensemble, enfant.sousensemble FROM TEMP parent, test.recettes enfant WHERE parent.sousensemble = enfant.ensemble ANDparent.level < 10 ) SELECT ensemble, count(*) FROM TEMP GROUP BY ensemble
Merci beaucoup, je teste cela tout de suite !
Apres essai de ta solution, celle-ci ne fonctionne pas. Voici le message d'erreur que j'obtiens:
Apres une recherche sur internet sur le code d'erreur, je suis tombé sur ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 [SQL0346] Récursivité non admise pour les expressions de tables communes. ... Modifiez les expressions de tables communes afin qu'elles fassent référence à une table existante ou à une expression de table commune déjà définie.
Etant donné que je suis actuellement sur iSeries, je pense que je ne peut pas utiliser la claude WITH.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Recursive common table expressions are not currently supported by DB2 UDB for iSeries...
En effet.
Il faudra attendre une version ultérieure.
Je ne comprend pas vraiment pourquoi on ne pas utiliser la clause WITH sur iSeries. As tu une explication ?
Sinon, pour completer ce que tu as deja dis, je met l'adresse d'un article traitant la clause WITH. Celui-ci est illustré par exemple qui permet une assez bonne comprehension.
http://www-128.ibm.com/developerwork...venigalla.html
En fait les moteur z/os, iSeries et Windows/Linux sont totalement différents. Les développements se font plus ou moins en parallèle mais il semble que la plateform Linux/Windows soit plus avançées. Probablement car étant la petite dernière, elle bénéficie du fait que plus de choses on pu être prévues à la base. Peut être aussi parceque la concurence est plus intense sur ce segment. Mais il s'agit d'un avis personnel que j'émet sur base de renseignements très lacunaires donc ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager