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 Oracle Discussion :

Cursor & Loop


Sujet :

SQL Oracle

  1. #1
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut Cursor & Loop
    Supposons que j'ai le schéma suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     For... LOOP
        OPEN CUR1;
        FETCH CUR1 INTO Var ;
        CLOSE CUR1;
      END LOOP;
    Et supposons, qu'au deuxième passage dans le FOR...LOOP, le cursor ne trouve aucune occurence. Est-ce que la valeur de Var est nulle, ou elle garde l'ancienne valeur du précedent passage ?
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu ne penses pas que tu irais plus vite à faire le test qu'à attendre la réponse ?

  3. #3
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    J'ai pas d'environnement de test devant moi. Une recherche sur google ne m'as pas trop aidé
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    http://www.developpez.net/forums/sho...d.php?t=287843

    et regarde le tuto PL/SQL parce que la syntaxe est perfectible

  5. #5
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Points : 211
    Points
    211
    Par défaut
    Citation Envoyé par blackhorus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     For... LOOP
        OPEN CUR1;
        FETCH CUR1 INTO Var ;
        CLOSE CUR1;
      END LOOP;
    Je dirai juste que si tu fais ta boucle 2 fois comme tu le fais là, VAR aura 2 fois la même valeur vu que tu fermes et que tu réouvres ton curseur.

    Lors du premier tour il prendra le premier enregistrement et lors du deuxième vu que tu auras fermé ton curseur et que tu l'auras réouvert, il reprendra la première ligne du curseur donc il remettra la même valeur dans VAR.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par blackhorus Voir le message
    J'ai pas d'environnement de test devant moi. Une recherche sur google ne m'as pas trop aidé
    Tu fais du dév sans bd ?

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Sauf erreur de ma part, dans ce cas la valeur de la variable est tout simplement non défini. Désolé mais faire le test ne servent pas de preuve dans ce cas!

  8. #8
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par Jerome_Mtl Voir le message
    Tu fais du dév sans bd ?
    Jérome, je veux pas être méchant... Mais, comment dire, c'est quoi l'utilité de tes remarques.

    Je suis en ce moment entrain de tester avec le lien que m'as gentillement fourni orafrance.
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par blackhorus Voir le message
    ...
    Je suis en ce moment entrain de tester avec le lien que m'as gentillement fourni orafrance.
    Comme je viens de le dire ce test ne vaut rien!

  10. #10
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Points : 211
    Points
    211
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Comme je viens de le dire ce test ne vaut rien!
    Je suis d'accord.

  11. #11
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Comme je viens de le dire ce test ne vaut rien!
    Oké.
    Donc, ce test est toujours true, même si la variable n'est pas définie.
    Ou, faut-il faire ce test...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF CUR1%NOTFOUND THEN 
            VAR1 := NULL;
         END IF;
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

  12. #12
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Points : 211
    Points
    211
    Par défaut
    Je ne comprends pas à quoi te sert ta boucle vu qu'à l'intérieur tu ouvres ton curseur et tu le refermes!!!

    Tu pourras faire autant de tour de boucle que tu voudras, il te retournera toujours la première valeur pointée par ton curseur dans ta variable.

    Si tu veux tester si tu n'as pas de valeur fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXIT WHEN CUR1%NOTFOUND;
    Mais je ne vois toujours pas l'utilité ^^

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par blackhorus Voir le message
    Jérome, je veux pas être méchant... Mais, comment dire, c'est quoi l'utilité de tes remarques.
    J'essaie de comprendre.

  14. #14
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    Voilà, après le test sur la table AVION dans la BD du site APEX.


    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
    DECLARE
    CURSOR CUR1(I INTEGER) IS
     SELECT capacite 
       FROM avion
      WHERE numero_avion = I;
     
    VAR1 AVION.CAPACITE%TYPE;
     
    BEGIN
     FOR I IN 105..107 LOOP 
      OPEN CUR1(I);
      FETCH CUR1 INTO VAR1 ;
      CLOSE CUR1;
      DBMS_OUTPUT.PUT_LINE (VAR1);
     
     END LOOP;
     
    END;
    Le résultat est le suivant :
    1200
    700
    700

    Instruction traitée.
    0,01 secondesSortie SGBD
    On voit bien qu'il a retourné 700, alors qu'aucune ligne ne correspond à 107.
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    normal, c'est la dernière valeur affectée à la variable

  16. #16
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par orafrance Voir le message
    normal, c'est la dernière valeur affectée à la variable
    Je croyais que le cursor effaçait la valeur VAR1 après un NOTFOUND ...

    Donc, il faut vraiment faire un test, pour éviter des mésaventures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    OPEN CUR1(I);
      FETCH CUR1 INTO VAR1 ;
      IF CUR1%NOTFOUND THEN 
            VAR1 := NULL;
      END IF;
      CLOSE CUR1;
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ou utiliser une méthode plus adéquate pour parcourir un curseur que tu trouveras dans le tutoriel PL/SQL

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

Discussions similaires

  1. [ ORACLE ][ STRUTS ] [ JAVA ] maximum open cursor
    Par LoulouFifi dans le forum Struts 1
    Réponses: 21
    Dernier message: 30/03/2011, 11h52
  2. Principe de l'instruction LOOP
    Par mathk dans le forum Assembleur
    Réponses: 25
    Dernier message: 16/05/2004, 11h08
  3. REF CURSOR... Comment ça marche ?
    Par Patkaza dans le forum SQL
    Réponses: 6
    Dernier message: 28/04/2004, 14h26
  4. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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