Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2008, 16h02   #1
Membre actif
 
Avatar de blackhorus
 
Inscription : février 2003
Messages : 208
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 208
Points : 190
Points : 190
Envoyer un message via MSN à blackhorus
Par défaut Cursor & Loop

Supposons que j'ai le schéma suivant :
Code :
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
blackhorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 16h09   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Tu ne penses pas que tu irais plus vite à faire le test qu'à attendre la réponse ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 16h22   #3
Membre actif
 
Avatar de blackhorus
 
Inscription : février 2003
Messages : 208
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 208
Points : 190
Points : 190
Envoyer un message via MSN à blackhorus
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
blackhorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 16h27   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
http://www.developpez.net/forums/sho...d.php?t=287843

et regarde le tuto PL/SQL parce que la syntaxe est perfectible
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 16h39   #5
Membre actif
 
Étudiant
Inscription : février 2008
Messages : 224
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2008
Messages : 224
Points : 185
Points : 185
Citation:
Envoyé par blackhorus Voir le message
Code :
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.
Milo59000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 16h44   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
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 ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 16h54   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
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!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h02   #8
Membre actif
 
Avatar de blackhorus
 
Inscription : février 2003
Messages : 208
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 208
Points : 190
Points : 190
Envoyer un message via MSN à blackhorus
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
blackhorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h07   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
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!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h09   #10
Membre actif
 
Étudiant
Inscription : février 2008
Messages : 224
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2008
Messages : 224
Points : 185
Points : 185
Citation:
Envoyé par mnitu Voir le message
Comme je viens de le dire ce test ne vaut rien!
Je suis d'accord.
Milo59000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h15   #11
Membre actif
 
Avatar de blackhorus
 
Inscription : février 2003
Messages : 208
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 208
Points : 190
Points : 190
Envoyer un message via MSN à blackhorus
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 :
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
blackhorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h22   #12
Membre actif
 
Étudiant
Inscription : février 2008
Messages : 224
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2008
Messages : 224
Points : 185
Points : 185
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 :
EXIT WHEN CUR1%NOTFOUND;
Mais je ne vois toujours pas l'utilité ^^
Milo59000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h28   #13
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
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.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h33   #14
Membre actif
 
Avatar de blackhorus
 
Inscription : février 2003
Messages : 208
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 208
Points : 190
Points : 190
Envoyer un message via MSN à blackhorus
Voilà, après le test sur la table AVION dans la BD du site APEX.


Code :
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 :
Citation:
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
blackhorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h40   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
normal, c'est la dernière valeur affectée à la variable
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 17h47   #16
Membre actif
 
Avatar de blackhorus
 
Inscription : février 2003
Messages : 208
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 208
Points : 190
Points : 190
Envoyer un message via MSN à blackhorus
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 :
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
blackhorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2008, 20h10   #17
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ou utiliser une méthode plus adéquate pour parcourir un curseur que tu trouveras dans le tutoriel PL/SQL
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h03.


 
 
 
 
Partenaires

Hébergement Web