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

PostgreSQL Discussion :

Boucle WHILE FOUND et UPDATE


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut Boucle WHILE FOUND et UPDATE
    Voilà un comportement étrange que j'ai du mal à éclaircir :

    Voici un exemple de boucle WHILE dans une fonction PL/PSQL :

    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
     
     
    DELCARE
     
    curseur CURSOR FOR SELECT *
    FROM client;
     
    ligne RECORD;
     
    BEGIN
     
    open curseur;
     
    FETCH curseur INTO ligne;
     
    WHILE FOUND LOOP
     
    RETURN NEXT ligne;
    UPDATE client SET nom = 'Dupont'
    WHERE nom = 'Durnad';
     
    FETCH curseur INTO ligne;
     
    END LOOP;
     
    close curseur;
     
    RETURN;
    END;
    Sous cette forme, j'ai bien au retour de ma fonction, les 12 lignes de ma table client qui sont retournées.

    Par contre avec ce code:

    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
     
     
    DELCARE
     
    curseur CURSOR FOR SELECT *
    FROM client;
     
    ligne RECORD;
     
    BEGIN
     
    open curseur;
     
    FETCH curseur INTO ligne;
     
    WHILE FOUND LOOP
     
    FETCH curseur INTO ligne;
     
    RETURN NEXT ligne;
    UPDATE client SET nom = 'Dupont'
    WHERE nom = 'Durnad';
     
    END LOOP;
     
    close curseur;
     
    RETURN;
    END;
    En mettant donc le FETCH directement après le WHILE, je n'ai plus qu'une ligne en sortie (la deuxième de la table).
    La première ligne est zappée, c'est normal avec le premier FETCH se trouvant avant le WHILE, mais pourquoi après le programme sort de la boucle et les 10 autres lignes ne sont pas retournées ?
    Pour quel raison FOUND est passé à FALSE ?

    Par contre, si j'enlève le UPDATE comme ça:
    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
     
     
    DELCARE
     
    curseur CURSOR FOR SELECT *
    FROM client;
     
    ligne RECORD;
     
    BEGIN
     
    open curseur;
     
    FETCH curseur INTO ligne;
     
    WHILE FOUND LOOP
     
    FETCH curseur INTO ligne;
     
    RETURN NEXT ligne;
     
    END LOOP;
     
    close curseur;
     
    RETURN;
    END;
    Là j'ai bien les 11 dernières lignes qui sont retournées.

    Merci d'avance pour vos éclaicissements

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Salut Matthieu
    Je recopie ici ma réponse que je t'ai déjà faite ailleurs, vu que ça peut servir à d'autres ;-)

    Je pencherai simplement pour le fait qu'UPDATE met à jour la variable FOUND, à TRUE si au moins une ligne est mise à jour, à FALSE sinon (voir à la fin de la page http://www.postgresql.org/docs/8.1/s...TS-DIAGNOSTICS, qui détaille tout ce qui peut affecter FOUND)

Discussions similaires

  1. [MySQL] UPDATE en boucle while
    Par gorjette dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 30/06/2011, 20h44
  2. [MySQL] Probleme UPDATE avec boucle WHILE
    Par iverson_mac dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 17h07
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 17h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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