Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/07/2007, 09h36   #1
Membre expérimenté
 
Inscription : mars 2002
Messages : 711
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 711
Points : 599
Points : 599
Par défaut procedure recursive avec Firebird

Bonjour,

Ayant tout d'abord voulu faire une requête recursive (disponible a priori selon le roadmap que dans la version 3), j'ai voulu faire une procedure récusive toute bête mais je ne réussi pas a renvoyer mes données...
Si quelqu'un peux me donner un conseil.

problématique :
j'ai une table user avec les données suivantes :
- USER_ID // ID de l'utilisateur
- USER_SUBSTITUTE_ENABLED // champ pour savoir si la suppléance est activé
- SUBBTITUTE_ID // id du suppléant

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SET TERM ^ ;
 
CREATE PROCEDURE GET_USER_MSG (
    ASUBSTITUTE_ID INTEGER,
    ADEPTH INTEGER)
RETURNS (
    AUSER_ID INTEGER)
AS
DECLARE VARIABLE TMP_USER_ID INTEGER;
begin
    FOR SELECT
        USER_ID
    FROM
        USER
    WHERE
        SUBSTITUTE_ID =:ASUBSTITUTE_ID
    AND
        USER_SUBSTITUTE_ENABLED = 1
    INTO
        TMP_USER_ID
    DO
    BEGIN
      IF (DEPTH > -1) then
      BEGIN
        EXECUTE PROCEDURE GET_USER_MSG (TMP_USER_ID, :DEPTH-1) RETURNING_VALUES :AUSER_ID;
        suspend;
      END
    END
end^
 
SET TERM ; ^
je ne récupère rien, pourquoi donc ? (dans la base, il y a bien des suppléant actifs et je met 5 en profondeur)

Merci
VLDG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 10h59   #2
Membre régulier
 
Inscription : février 2005
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 100
Points : 88
Points : 88
C'est normal. A chacune de tes exécutions récursives, ta variable de sortie AUSER_ID ne prend pas de valeur.

Essaie plutôt le code suivant en supposant que cela soit le traitement que tu cherches :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SET TERM ^ ;
 
CREATE PROCEDURE GET_USER_MSG (
    ASUBSTITUTE_ID INTEGER,
    ADEPTH INTEGER)
RETURNS (
    AUSER_ID INTEGER)
AS
DECLARE VARIABLE TMP_USER_ID INTEGER;
begin
    FOR SELECT
        USER_ID
    FROM
        USER
    WHERE
        SUBSTITUTE_ID =:ASUBSTITUTE_ID
    AND
        USER_SUBSTITUTE_ENABLED = 1
    INTO
        TMP_USER_ID
    DO
    BEGIN
      IF (DEPTH > -1) then
      BEGIN 

         /* parcours récursif */
         SELECT AUSER_ID FROM GET_USER_MSG (TMP_USER_ID, :DEPTH-1) INTO :AUSER_ID;

        suspend;
      END
      ELSE 
      BEGIN  

         /* affectation de la variable qui sera retournée */
         AUSER_ID = :TMP_USER_ID; 
         suspend;

      END
    END
end^
 
SET TERM ; ^
sillycoder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 11h46   #3
Membre expérimenté
 
Inscription : mars 2002
Messages : 711
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 711
Points : 599
Points : 599
Merci mais ça ne fonctionne pas mieux...

en plus si j'ai une personne qui est suppléante de 2 autres : je peux avoir le message suivant : multiple rows in singleton select.
VLDG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 14h33   #4
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Citation:
Envoyé par VLDG
Ayant tout d'abord voulu faire une requête recursive (disponible a priori selon le roadmap que dans la version 3)
En fait disponible dans Firebird 2.1
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 17h05   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Pas certain d'avoir tout compris, mais vite fait quelque chose comme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SET TERM ^^ ;
CREATE PROCEDURE GET_USER_MSG (
  ASUBSTITUTE_ID Integer,
  ADEPTH Integer)
 returns (
  AUSER_ID Integer)
AS
DECLARE VARIABLE TMP_USER_ID INTEGER;
begin
    FOR SELECT
        USER_ID
    FROM
        MY_USER
    WHERE
       SUSBTITUTE_ID  =:ASUBSTITUTE_ID
    AND
        USER_SUBSTITUTE_ENABLED = 1
    INTO
        :TMP_USER_ID
    DO
    BEGIN
      IF (ADEPTH > -1) then
      BEGIN
       EXECUTE PROCEDURE GET_USER_MSG (TMP_USER_ID, ADEPTH-1) RETURNING_VALUES (:AUSER_ID);
       AUSER_ID = TMP_USER_ID;
       suspend;
      end
    END
end
^^
SET TERM ; ^^
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 12h28   #6
Membre expérimenté
 
Inscription : mars 2002
Messages : 711
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 711
Points : 599
Points : 599
Merci pous vos essai mais ça ne fait pas ce que je voulais.
Je me suis surement mal exprimé. J'ai donc résolu le problème en le faisant dans mon code applicatif.
VLDG est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h00.


 
 
 
 
Partenaires

Hébergement Web