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 :

"N" procédures stockées exécutées dans un seul code


Sujet :

SQL Firebird

  1. #41
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Ph. B. a parfaitement raison
    Si la requête ne renvoie rien, l'intérieur du BEGIN...END ne sera pas executé.
    S'il y a une volonté de faire quelque chose, il est, par exemple, possible de passer par un EXISTS préliminaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IF (EXISTS(select ....)) THEN
    Begin
       -- Faire la procédure qui propose des infos
    End ELSE
    Begin
       -- Faire qq chose quand la requête ne sort rien
    END
    Merci d'ajouter un sur les tags qui vous ont aidé

  2. #42
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    @Ph. B. : là je comprends mieux je vais recourir à l'alternative proposée par olivier.
    @dehorter olivier : merci pour l'astuce.

    En route pour les corrections
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #43
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Bonjour Ph. B.

    je viens de tenter ce bout de code mais j'ai eu en retour une erreur à l'exécution :
    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
    STEP_ = '';
       NBR_ = 0;
       RATIO_ = -1;
       NUM = 1;
       LIGNE = LIGNE || ascii_char(13) || ascii_char(10);
       LIGNE = LIGNE || 'III - ANALYSE DES DEPASSEMENTS PMA / PMD'
                     || ascii_char(13) || ascii_char(10);
       FOR
        -- je crois pas que c'est le bon emplacement du if car il bloque sur cette ligne
           IF (EXISTS(SELECT NOM_STEP,
                  count(NBR_DEP),
                  max(PMD)
     
           FROM "[8]PS_DEPASS_PMAPMD"(:DATE_DEBUT, :DATE_FIN)
     
           WHERE (NOM_STEP like upper(:N_STEP))
     
           GROUP BY NOM_STEP
     
           INTO :STEP_,
                :NBR_,
                :RATIO_
             )) THEN
       DO BEGIN
            if (NBR_ = 0) then
                LIGNE = LIGNE || LPAD(' ',4, ' ')
                        || 'Cette STEP n''enregistre aucun dépassement de la PMD. ';
            else
            LIGNE = LIGNE || LPAD(' ',4, ' ') || 'PMD (kw): '
                          || coalesce(cast(ratio_ as integer), ' ')
                          || ascii_char(13) || ascii_char(10)
                          || LPAD(' ',4, ' ') || 'Dépassement en PMA '
                          || coalesce(NBR_,'') || ' fois '
                          || 'du ' || :date_debut || ' au ' || :date_fin
                          || ascii_char(13) || ascii_char(10);
       END
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #44
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    regardes bien le schéma
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IF (EXISTS(SELECT ....)) THEN
    Begin
       -- Faire la procédure qui propose des infos
        FOR 
           SELECT ....   -- rajouter pour etre plus clair !
        Begin
     
        End   
    End ELSE
    Begin
       -- Faire qq chose quand la requête ne sort rien
    END
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #45
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Voici le code à quoi il ressemble :
    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
    /******* Analyse des dépassements  ***************/
       STEP_ = '';
       NBR_ = 0;
       RATIO_ = -1;
       NUM = 1;
       LIGNE = LIGNE || ascii_char(13) || ascii_char(10);
       LIGNE = LIGNE || 'III - ANALYSE DES DEPASSEMENTS PMA / PMD'
                     || ascii_char(13) || ascii_char(10);
     
       IF (EXISTS(SELECT * FROM
            "[8]PS_ANALYSE_COS_PHI_DRAIDJ"(:DATE_DEBUT, :DATE_FIN))) THEN
     
       BEGIN
         FOR
           SELECT NOM_STEP,
                  count(NBR_DEP),
                  max(PMD)
     
           FROM "[8]PS_DEPASS_PMAPMD"(:DATE_DEBUT, :DATE_FIN)
     
           WHERE (NOM_STEP like upper(:N_STEP))
     
           GROUP BY NOM_STEP
     
           INTO :STEP_,
                :NBR_,
                :RATIO_
     
        DO BEGIN
            LIGNE = LIGNE || LPAD(' ',4, ' ') || 'PMD (kw): '
                          || coalesce(cast(ratio_ as integer), ' ')
                          || ascii_char(13) || ascii_char(10)
                          || LPAD(' ',4, ' ') || 'Dépassement en PMA '
                          || coalesce(NBR_,'') || ' fois '
                          || 'du ' || :date_debut || ' au ' || :date_fin
                          || ascii_char(13) || ascii_char(10);
        END
       END
       ELSE
            LIGNE = LIGNE || LPAD(' ',4, ' ')
                        || 'Cette STEP n''enregistre aucun dépassement de la PMD. ';
    Pour être sûr, j'ai exécuté la PS "[8]PS_DEPASS_PMAPMD" toute seule dont le but de lui passer des arguments qui ne donneront pas de lignes. Mais quand je l'exécute dans ce bout de programme le else n'est jamais parcouru bien que le résultat soit nul !!!

    où peut bien être le problème ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  6. #46
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    il faut que la requête dans le EXISTS doit renvoyer les mêmes infos...
    Donc où est la clause WHERE dans le EXISTS ????
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #47
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    il faut que la requête dans le EXISTS doit renvoyer les mêmes infos...
    Donc où est la clause WHERE dans le EXISTS ????
    Merci olivier ... bien vue de votre part je viens de corriger.
    mais coté logique tout ça reste floue ! à quoi bon refaire le même code si on pouvait p.e faire un simple teste dans le begin .. end du do, ce qui a comme conséquence directe d'éliminer une bonne partie du code et un gain de temps appréciable même si les autres diront que les machines d'aujourd'hui sont super puissant !!!

    pour ma part, je vois pas trop pourquoi toute cette gymnastique le mieux aurait été quelque chose du genre :

    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
     
    BEGIN
         FOR
           SELECT * FROM VotrePS(:arg1, :arg2, ... , :argn)
     
           WHERE (votre_filtre)
     
           GROUP BY votre_champs
     
           INTO :var1,
                :var2,
                :varn
     
        DO BEGIN
          if (nbr_enregistrements <> 0) then 
                     Traitement_1
         else Traitement_2
        END
    merci encore olivier.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  8. #48
    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 : 60
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  9. #49
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par makowski Voir le message
    une belle solution mais pas dans mon cas ... hélas
    voilà ce qui es écrit dans l'aide en ligne Firebird.

    Note

    ROW_COUNT cannot be used to determine the number of rows affected by an EXECUTE STATEMENT or EXECUTE PROCEDURE command.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  10. #50
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Just-Soft Voir le message
    une belle solution mais pas dans mon cas ...
    Relecture de la même doc :
    In a FOR SELECT loop, ROW_COUNT is incremented with every iteration (starting at 0 before the first).
    Implémentation dans votre code (instruction en vert):
    Code sql : 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
    /******* Analyse des dépassements  ***************/
       STEP_ = '';
       NBR_ = 0;
       RATIO_ = -1;
       NUM = 1;
       LIGNE = LIGNE || ascii_char(13) || ascii_char(10);
       LIGNE = LIGNE || 'III - ANALYSE DES DEPASSEMENTS PMA / PMD'
                     || ascii_char(13) || ascii_char(10);
     
       FOR
         SELECT NOM_STEP,
                count(NBR_DEP),
                max(PMD)
     
         FROM "[8]PS_DEPASS_PMAPMD"(:DATE_DEBUT, :DATE_FIN)
     
         WHERE (NOM_STEP LIKE upper(:N_STEP))
     
         GROUP BY NOM_STEP
     
         INTO :STEP_,
              :NBR_,
              :RATIO_
     
      DO BEGIN
          LIGNE = LIGNE || LPAD(' ',4, ' ') || 'PMD (kw): '
                        || coalesce(cast(ratio_ AS integer), ' ')
                        || ascii_char(13) || ascii_char(10)
                        || LPAD(' ',4, ' ') || 'Dépassement en PMA '
                        || coalesce(NBR_,'') || ' fois '
                        || 'du ' || :date_debut || ' au ' || :date_fin
                        || ascii_char(13) || ascii_char(10);
      END
      IF (ROW_COUNT = 0) THEN
            LIGNE = LIGNE || LPAD(' ',4, ' ')
                        || 'Cette STEP n''enregistre aucun dépassement de la PMD.';
    Philippe.

  11. #51
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Merci Ph. B. C'est génial, votre solution marche très bien.
    Je ne sais pas pourquoi je veux tout faire dans le begin end du do du select. En tout cas, c'est bien meilleur que le if Exists, merci encore Ph. B.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/09/2016, 09h50
  2. Procédure stockée, concaténation dans requête
    Par sbeu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2005, 13h03
  3. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 10h47

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