IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

procedure recursive avec Firebird


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ; ^

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    Par défaut
    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.

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    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

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Pas certain d'avoir tout compris, mais vite fait quelque chose comme :
    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
    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 ; ^^

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    Par défaut
    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.

Discussions similaires

  1. SUM avec firebird / interbase
    Par Jeankiki dans le forum InterBase
    Réponses: 5
    Dernier message: 28/10/2004, 23h13
  2. Display avec firebird
    Par santo dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 22/10/2004, 14h02
  3. Procedure stockée avec un parametre en OUTPUT
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/09/2004, 20h06
  4. pbl procedure liée avec delphi
    Par coucoucmoi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 09/02/2004, 18h12
  5. Procedure stockée avec ntext dans SQL server 2000
    Par nagababa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/11/2003, 20h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo