|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 5 ![]() |
Bonjour à tous,
j'essaie depuis des heures de trouver ce qui empêche ma proc. de "tourner rond" et je n'arrive à rien ! le premier curseur est censé être traité et inséré dans une table (préalablement vidée à chaque lancement de la procédure) mais une seule ligne est insérée (1er résultat de la requête) et j'ai bien vérifié le résultat de la requête du dit curseur, je suis censé avoir plus de 20000 enregistrements ! je ne comprends pas ! Help me please ! Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
Salut,
Essaye d'utiliser le type bool pour exit_proc déjà, 1 octect c'est mieux que 4 pour un pauvre vrai/faux Ensuite, si tu as des curseurs et 1 seul continue handler général, tu dois sauvegarder l'état de la variable qu'il modifie avant d'entrer dans le curseur interne et le restituer en sortie de celui ci sous peine de ne lire que la première ligne du curseur externe et de sortir direct... Comme là 2ème solution tu peux déclarer un handler dans ton begin end, celui de cmd ici, qui modifiera une autre variable bool déclarée avec lui... tout bête
|
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() |
Salut je ne sais pas si ça peut aider mais dans les procédures stockées dont j'ai hérité de la maintenance avant chaque repeat la variable qui sert pour le handler (en l'occurrence pour toi exit_proc) était initialisée à 0 ce que je n'ai pas vu avant ton premier repeat... Peut être que pour lui proc_exit vaut 1 tout de suite et il ne passe donc qu'une fois dans ta boucle...
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 5 ![]() |
bonjour et merci pour cette réponse, malheureusement j'ai beau essayer, je n'arrive à rien ! j'ai modifié le mode de sortie des boucles, cela fonctionne mieux mai il reste des résultats incohérents, je reviendrais poster dès que j'aurais trouvé la solution.
merci en tout cas, bon week end |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
salut,
Code sql :
|
||
|
|
00
|
|
|
#6 | ||
|
Membre régulier
![]() |
j'ai le même problème...
j'ai ajouté une variable pour compter le nombre de passage dans la boucle et cela vaut toujours 1... voici mon code : Code :
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
||
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
c'est une horreur ta procédure...
...539 lignes...déjà je vais t'apprendre à bien utiliser un curseur... fetch ne garantit jamais que tu récupère des données (si ton select du curseur ne renvoie rien par exemple) donc IL FAUT TOUJOURS TESTER QUE TU AS BIEN UN RETOUR GRACE A LA VARIABLE QUI EST GEREE PAR LE HANDLER CONTINUE: Code sql :
|
||
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() |
d'accord merci beaucoup pour cette explication qui ne m'était pas naturelle (puisque je viens du monde Oracle dans lequel mes variables sont toujours remplies lors du parcours d'un curseur..)
Désolé pour l'horreur mais je l'ai récupérée comme ça la procédure (en dehors des blocs délimités par les commentaires qui correspondent à mes modifications
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
oracle est loin d'être une bonne école car à force de compter sur le sgbd pour penser à tout un tas de détails les gens pondent souvent du code pas si propre et portable que ça... ^^
c'est comme une variable que tu initialise pas... elle pas null par défaut... null est bien une valeur et un état... |
|
|
00
|
|
|
#10 | ||
|
Membre régulier
![]() |
j'ai fait les modifs que tu m'as conseillé :
Code sql :
PS : la dernière trace de debug (celle dans le else) ne t'es pas destinée mais à moi dans le sens : "t'es trop c*n t'as pas compris ce qu'il t'a dit le monsieur" EDIT : si je ne voyais rien c'est que ma requête était mal faite au temps pour moi.... Par contre mon compteur de passages dans la boucle est toujours à 0 et j'ai toujours la trace que mon curseur est naze....
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
||
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
question est ce qu'il y aurait pas un truc qui mettrait done à 1 avant de rentrer dans le repeat?
|
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() |
je viens de (re-re-re-re) vérifier et en fait il se trouve que je n'ai pas de données pour cette période... Je teste sur une période où j'ai des données et je te tiens au courant.
Désolé pour cette erreur de débutant....
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
|
|
00
|
|
|
#13 |
|
Membre régulier
![]() |
bon c'était pas ça non plus...
j'ai toujours le même problème mais cette fois je suis sûr d'avoir des données (j'ai exécuté la requête du curseur en remplaçant les variables par les valeurs retournées lors de la précédente exécution de mon curseur et j'ai bien des données...) pour répondre à ta question vu que je ne sais pas ce qui pourrait faire passer done à 1 je ne sais pas...
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
recherche done dans le texte de ta procédure pour voir où il apparait
pour vérifier ton curseur simple exécute juste la requête pour voir ce qu'elle retourne ^^ |
|
|
00
|
|
|
#15 | |
|
Membre régulier
![]() |
Citation:
quant au handler continue done c'est moi qui l'ai déclaré et utilisé donc il n'apparaît que dans mes modifs et donc que dans le parcours du curseur (j'ai re-vérifié)...
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
|
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
tu mets bien avant le repeat:
et après la boucle: |
|
|
00
|
|
|
#17 | ||
|
Membre régulier
![]() |
oui
voilà le code : Code sql :
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
||
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
mets SQLSTATE '02000' au lieu de not found dans ton gestionnaire plutot
|
|
|
00
|
|
|
#19 |
|
Membre régulier
![]() |
oui NOT FOUND était un essai.... si tu regardes mes bouts de code plus haut c'est SQLSTATE '02000'
__________________
[/HS] une pétition pour la libération des drivers matériels ici J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com