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

Oracle Discussion :

Boucles et FETCH


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Boucles et FETCH
    Bonjour,

    J'ai un petit problème avec FETCH. Voila le principe de mon programme :
    J'ai un curseur qui boucle sur une table principale et qui me recupère l'id de chaque ligne.
    Dans cette boucle, je recupere un certain nombre de valeurs grace à différents curseurs sur des tables associées à la principale grace à l'id de la premiere.
    FETCH me renvoie bien les valeurs souhaitées mais lorsqu'une ligne correspondante n'existe pas dans une table, il me renvoie la valeur de la boucle précédente, qui correspond a un ancien id.

    Comment faire pour qu'il ne me renvoie rien lorsqu'aucune ligne est trouvée plutot que de me renvoyer a chaque fois la derniere valeur qu'il a trouvé, ce qui fausse tous les calculs !!!

    Merci d'avance.
    Benoit HENRY.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Il faudrait qu'on voit le code, pourquoi ne pas faire une boucle FOR, c'est plus simple

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Il suffit de faire un exit après le fetch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    loop
       fetch monCurseur into ...
       exit when monCurseur%notfound;
    end loop;

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci de vos réponses.
    Alors voila le code en gros :

    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
     
    CURSOR curseurMaitre_Type IS SELECT * FROM ....
     
    CURSOR curseur1 (id IN BASE.TABLE1.id%TYPE) IS SELECT * FROM TABLE1;
    CURSOR curseur2 (id IN BASE.TABLE2.id%TYPE) IS SELECT * FROM TABLE2;
    ...
     
    table1 BASE.TABLE1%ROWTYPE;
    table2 BASE.TABLE2%ROWTYPE;
    ...
     
    BEGIN
     
      FOR curseurMaitre IN curseurMaitre_Type
      LOOP
     
        OPEN curseur1(curseurMaitre.id);
        OPEN curseur2(curseurMaitre.id);
        ...
     
        FETCH curseur1 INTO table1; 
        FETCH curseur2 INTO table2;
        ...
     
        IF table1.champ1 = 'aaa' and table2.champ1 = 'bbb' then....
        ELSIF table1.champ1 = 'ccc' and table2.champ1 = 'ddd' then....
     
     
       --fermeture des curseurs
       CLOSE curseur1;
       CLOSE curseur2;
     
      END LOOP;
     
    END;
    Voila donc quand je fais mes tests et qu'aucune ligne existe dans la table 2 par exemple, cela me sort comme valeur des valeurs d'un ligne correspondante à un ancien id....
    Je ne peux pas non plus utiliser exit car il faut que je continue d'effecuter tous les calcus.
    Quelq'un a t'il une idée ?
    Benoit

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    table1 et table2 sont des variables : Il suffit de les RAZ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table1 := NULL; table2 := NULL;
    FETCH curseur1 INTO table1; 
    FETCH curseur2 INTO table2;

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] PB Boucle : while(..= ..->fetch())
    Par glaconutella dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/03/2011, 01h12
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 13h45
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 11h47
  4. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 10h38
  5. Réponses: 2
    Dernier message: 29/05/2002, 21h43

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