|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Bonjour,
Voici mon problème : j'ai une procédure stockée qui permet des mettre à jour un champ dans plusieurs tables. Mon problème est que pour certaines tables ça marche sans problème et pour d'autres seules quelques lignes sont traitées et aucune erreur n'est retournée. Si je relance la procédure pour ces tables, quelques lignes sont traitées en plus (par exemple, au premier passage, 2 lignes sont traitées, puis 5, puis 10... c'est complètement aléatoire), de sorte que si je lance la procédure assez de fois, toute la table est traitée. Est-ce que quelqu'un a déjà eu ce type de problème ? et si oui, d'où cela peut-il venir ? Merci |
|
|
00
|
|
|
#2 |
![]() ![]() |
Est-ce que tu as vérifié la valeur du rowcount ?
Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Merci, mais ça ne change rien...
Une autre idée ? |
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Peux tu nous synthétiser ta proc avec des noms parlant comme Table_A ... sans le vocabulaire métier de ton traitement ?
|
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
ok :
Code :
Merci |
||
|
|
00
|
|
|
#6 |
![]() ![]() |
Vérifie le code de la proc "gen_champs" - est-ce qu'elle a un "set rowcount" quelque part ?
Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Ca ne change rien non plus...
Cette procédure sert juste à remplacer des caractères accentués par des caractères non accentués. La voici (en partie) : Code :
Si je lance plusieurs fois le chargement sur les tables traitées en partie, elles finnisent par être completement traitées (et de plus, je n'ai pas d'erreur renvoyée) : donc le problème ne vient pas des tables non plus. Si j'isole le traitement de ces tables dans une autre procédure, j'ai le même problème : donc pas un problème de mémoire (d'autant plus que ces tables contiennet moins de 1000 lignes). Donc, d'où vient le problème ??? Merci pour votre aide. |
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Si je rajoute un PRINT de @@ROWCOUNT après les FETCH :
exécution1 : rowcount : 1 rowcount : 2 rowcount : 3 rowcount : 3 (1 row affected) (return status = 0) exécution2 : rowcount : 1 rowcount : 2 rowcount : 3 rowcount : 4 rowcount : 5 rowcount : 5 (1 row affected) (return status = 0) exécution3 : rowcount : 1 rowcount : 2 rowcount : 3 rowcount : 4 rowcount : 5 rowcount : 6 rowcount : 6 (1 row affected) (return status = 0) et ainsi de suite... |
|
|
00
|
|
|
#9 |
![]() ![]() |
Je ne vois pas vraiment où pourrait être le problème - la boucle du fetch par curseur semble correcte.
Un dbcc checktable() de l'une ou l'autre table source serait peut-être judicieux juste pour s'assurer qu'il n'y a pas de corruption. Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
le DBCC CHECKTABLE ne donne rien, les tables ne sont pas endomagées...
Merci quand même pour ton aide. |
|
|
00
|
|
|
#11 |
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Tu updates une table sur laquelle tu as ouvert un curseur FOR SELECT.
La syntaxe FOR UPDATE couplé avec update table set champ=??? where current of ton_curseur serait peut etre plus adaptée. Merci de nous tenir au courant. Le champs mis à jour ne serait il pas dans la clé ou un index ? Quel est le shema de verrouillage des tables qui posent probleme ? |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Je viens de trouver quelque chose : les tables concernées n'ont pas de clé primaire.
En changeant mon curseur en UPDATE et en faisant l'update avec 'where CURRENT OF curs", j'ai l'erreur suivante : The optimizer could not find a unique index which it could use to scan table 'motcle' for cursor 'curs'. (return status = -6) Celà dit, dans la version inotiale du script, je n'utilisait pas de clé puisque je faisait un update sur "id = @id" ou "nom = @res" (id et nom n'étant pas définis comme clé primaires) Donc ma question : comment faire un update sur des tables sans clé ? Merci |
|
|
00
|
|
|
#13 | |
|
Membre du Club
![]() Inscription : octobre 2005 Messages : 79 ![]() |
Citation:
Par contre changer le schéma de ta table n'est peut être pas conseillé, je m'explique cela va solutionner ton problème lié à ton curseur mais risque de te créer d'autres problèmes (accès aux data, etc ...). Quel est le problème, pourquoi tu ne peux pas mettre une clé ? |
|
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Effectivement, je peux modifier mes tables pour rajouter une clé, mais cette solution est difficilement envisageable car elles sont utilisées par beaucoup d'applications.
Existe-t-il une autre solution ? (et est-ce que quelqu'un pourrait m'expliquer ce phénomène? Pourquoi lors d'un update d'une table sans clé, seules quelques lignes sont prises en compte, puis un peu plus, et ainsi de suite...?) Merci |
|
|
00
|
|
|
#15 |
![]() ![]() |
Le problème c'est que le curseur crée un plan d'exécution, et qu'en updatant la table "sous lui" tu fais en sorte que la suite des lignes à lire devient incorrecte et ASE pense qu'il n'y a plus de lignes à lire.
Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Ok, je crois que j'ai compris.
Donc normalement, en passant par une table temporaire (avec une clé celle-là) ça devrait être bon. Je vous tiens au courant. Merci pour votre aide. |
|
|
00
|
|
|
#17 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
A mon avis cela devrait marcher :
Code :
|
||
|
|
00
|
|
|
#18 | |
|
Membre du Club
![]() Inscription : octobre 2005 Messages : 79 ![]() |
Citation:
- soit avoir un clé - soit un schéma datarow Si vous ne respectez pas ces conditions vous obtenez des comportements aléatoire car le curseur n'a pas de moyens pour identifier les enregistrements de façon unique. |
|
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 12 ![]() |
Ca marche !
Merci à tous pour votre aide. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com