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

Sybase Discussion :

[T-SQL]Curseur et boucle infinie


Sujet :

Sybase

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 !

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Est-ce que vous modifiez bien la variable "sqlstatus" qui est la SEULE condition de boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    WHILE @@sqlstatus = 0
    ...

  3. #3
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut
    Non je n'y touche pas, c'est ce qui me perturbe

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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.

  5. #5
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut
    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 ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Sous Oracle, la fin d'un curseur est détectée par une instruction de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

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

Discussions similaires

  1. PL/SQL et boucle infinie
    Par bigguiz dans le forum PL/SQL
    Réponses: 8
    Dernier message: 10/05/2007, 14h55
  2. [PL/SQL) Curseur et nom de champ explicite
    Par Loko dans le forum Oracle
    Réponses: 6
    Dernier message: 01/12/2004, 15h07
  3. [PL/SQL] Curseur avec Paramètre
    Par blids dans le forum Oracle
    Réponses: 5
    Dernier message: 10/10/2004, 20h07
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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