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

  1. #1
    Membre éprouvé 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
    Points : 1 067
    Points
    1 067
    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 chevronné

    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
    Points : 1 775
    Points
    1 775
    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 éprouvé 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
    Points : 1 067
    Points
    1 067
    Par défaut
    Non je n'y touche pas, c'est ce qui me perturbe

  4. #4
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    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 éprouvé 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
    Points : 1 067
    Points
    1 067
    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 chevronné

    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
    Points : 1 775
    Points
    1 775
    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é.

  7. #7
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    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.

  8. #8
    Membre éprouvé 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
    Points : 1 067
    Points
    1 067
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é...

  9. #9
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    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
    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 : 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
    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

  10. #10
    Membre éprouvé 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
    Points : 1 067
    Points
    1 067
    Par défaut
    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

  11. #11
    Membre éprouvé 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
    Points : 1 067
    Points
    1 067
    Par défaut
    c'était ça, merci bien

+ 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