Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
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 01/02/2007, 17h20   #1
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
Par défaut [T-SQL]Curseur et boucle infinie

Bonjour à tous !

J'ai un code qui ne fonctionne pas et je commence à craquer, c'est sur Sybase.

Cette chose boucle à l'infini, alors qu'elle ne devrait faire que 32 itérations (qui est le nb de tupes de la table temporaire #data)



Je fais donc mes déclarations :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
DECLARE cur CURSOR FOR 
	SELECT 
		favor,
		place_id,
		currency_id,
		service_id,
		security_id,	
		date,
		legal_end_session
	FROM #data
GO
 
DECLARE @third_id int,@place_id int, @currency_id int, @service_id int, @security_id int, @date_deal datetime, @comm_indirect float, @legal_end_session datetime



Voila la boucle proprement dite :

Code :
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
30
31
32
33
34
35
36
37
38
OPEN cur  
FETCH cur INTO @third_id,@place_id,@currency_id,@service_id,@security_id,@date_deal,@legal_end_session
WHILE @@sqlstatus = 0
BEGIN
 
 
	-- calcul des commissions sur le même titre, après @date_deal jusqu'à la clôture	
	SELECT 	
		@comm_indirect = SUM(...)
	FROM  	
		...
	WHERE	
		...
		AND h.begin_date <= @date_deal AND @legal_end_session <= ISNULL(h.end_date,@legal_end_session)
		AND b.favor       = @third_id
		AND s.place_id    = @place_id
		AND h.currency_id = @currency_id
		AND b.service_id  = @service_id
		AND s.security_id = @security_id
 
		-- on sauvegarde la comm indirecte calculée
		UPDATE #data
		SET 
			indirect_comm = @comm_indirect
		WHERE 
			favor       = @third_id
		AND place_id    = @place_id
		AND date        = @date_deal
		AND currency_id = @currency_id
		AND service_id  = @service_id
		AND security_id = @security_id
		AND legal_end_session = @legal_end_session
 
 
END
 
CLOSE cur
DEALLOCATE CURSOR cur


Si vous voyez quelque chose d'évident qui pourrait expliquer les boucles infinies, je veux bien de votre aide !
__________________
Solidarités Nouvelles face au Chômage association loi de 1901, indépendante de tout parti politique et de toute confession religieuse.
Mathusalem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 17h34   #2
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Est-ce que vous modifiez bien la variable "sqlstatus" qui est la SEULE condition de boucle :
Code :
1
2
3
...
WHILE @@sqlstatus = 0
...
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 17h36   #3
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
Non je n'y touche pas, c'est ce qui me perturbe
__________________
Solidarités Nouvelles face au Chômage association loi de 1901, indépendante de tout parti politique et de toute confession religieuse.
Mathusalem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 18h00   #4
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Si tu rentres dans le corps de cette boucle (c'est-à-dire que sqlstatus vaut 0) et que cette variable n'est pas modifiée dans le corps de la boucle alors ton explication PEUT venir de là.

Remarque : le corps de la boucle peut aussi contenir une instruction provoquant une sortie explicite de la boucle donc il ne faut pas uniquement se focaliser sur sqlstatus et la condition du while.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 18h03   #5
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
normalement c'est pas le FETCH qui modifie le sqlstatus ?

quand il n'y a plus de tuples à lire dans le curseur il change le sqlstatus et je sors bien ?
__________________
Solidarités Nouvelles face au Chômage association loi de 1901, indépendante de tout parti politique et de toute confession religieuse.
Mathusalem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 07h47   #6
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Sous Oracle, la fin d'un curseur est détectée par une instruction de ce type :
Code :
1
2
 
EXIT WHEN <mon_curseur>%NOTFOUND;
Maintenant cela doit être spécifique à Sybase donc envoyez moi un mail si vous voulez que je déplace votre post dans le forum approprié.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 10h00   #7
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Il te manque un fetch dans la boucle While ( il n'est pas automatique comme sous oracle avec for i in select ... loop ... endloop)
Tu peux le mettre juste avant la fin de la boucle.
S'il tombe en erreur, le @@sqlstatus vaudra 1 et si tu es arrivé à la fin du curseur il vaudra 2.
Et tu pourras ainsi sortir de ta boucle.
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 10h28   #8
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
Citation:
Envoyé par Jean.Cri1
Il te manque un fetch dans la boucle While ( il n'est pas automatique comme sous oracle avec for i in select ... loop ... endloop)
Tu peux le mettre juste avant la fin de la boucle.
S'il tombe en erreur, le @@sqlstatus vaudra 1 et si tu es arrivé à la fin du curseur il vaudra 2.
Et tu pourras ainsi sortir de ta boucle.

ça signifie que je devrais avoir ça ?
Code :
1
2
3
4
 
WHILE @@sqlstatus = 0
BEGIN
FETCH cur INTO @third_id,@place_id,@currency_id,@service_id,@security_id,@date_deal,@legal_end_session


edit : désolé je ne peux pas tester serveur surchargé...
__________________
Solidarités Nouvelles face au Chômage association loi de 1901, indépendante de tout parti politique et de toute confession religieuse.
Mathusalem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 10h59   #9
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
OPEN cur  
FETCH cur INTO @third_id,@place_id,@currency_id,@service_id,@security_id,@date_deal,@legal_end_session
WHILE @@sqlstatus = 0
BEGIN
 
	-- calcul des commissions sur le même titre, après @date_deal jusqu'à la clôture
		...
		...
	-- on sauvegarde la comm indirecte calculée
		...
		...
	FETCH cur INTO @third_id,@place_id,@currency_id,@service_id,@security_id,@date_deal,@legal_end_session
 
END
 
CLOSE cur
DEALLOCATE CURSOR cur
ou alors
Code :
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
declare @lus int ...
declare ton_curseur cursor FOR ...
IF @@error !=0 goto balise_erreur
 
open ton_curseur 
IF @@error !=0 goto balise_erreur
 
SELECT @lus=0
WHILE 1=1
BEGIN
    fetch ton_curseur INTO @tes_variables ...
    IF @@error !=0 OR @@sqlstatus =1 goto balise_erreur
    IF @@sqlstatus =2 BREAK --plus d'enregistrements
 
    SELECT @lus =@lus+1
    --ton traitement de l'enregistrement lu
END
print '%1! enregistrement(s) lus',@lus
 
close ton_curseur
IF @@error !=0 goto balise_erreur
 
deallocate cursor ton_curseur
 
balise_erreur:
deallocate cursor ton_curseur
--ton traitement d'erreur
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 11h04   #10
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
merci beaucoup,

j'aime mieux la 1ère solution que tu proposes, plus simple.


Je mettrai en résolu quand je pourrai tester, saleté de serveur
__________________
Solidarités Nouvelles face au Chômage association loi de 1901, indépendante de tout parti politique et de toute confession religieuse.
Mathusalem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 13h49   #11
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
c'était ça, merci bien
__________________
Solidarités Nouvelles face au Chômage association loi de 1901, indépendante de tout parti politique et de toute confession religieuse.
Mathusalem 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 01h44.


 
 
 
 
Partenaires

Hébergement Web