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

Développement SQL Server Discussion :

[T-SQL] Prolème de curseur


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut [T-SQL] Prolème de curseur
    Bonjour à tous et à toutes!

    Objectif: J'effectue une requête, dont le résultat est parcouru par un curseur qui lui même construit une chaîne. Ma procédure doit retourner cette chaine.

    Problème: Mes variables ne gardent pas leurs valeurs lors du fetch.


    Voici ma procédure stockée en T-SQL:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    ALTER PROCEDURE [dbo].[ACFY_GetCurseurText]
     
    AS
     
    BEGIN
    	-- Déclaration du curseur
    	DECLARE K CURSOR FOR
    		SELECT adhnom, adhnum, ouvnum, ouvtit
    		FROM adherents, emprunts, ouvrages
    		WHERE adhnum = eadhnum
    			AND ouvnum = eouvnum
    		ORDER BYadhnum
     
    	-- Déclaration des variables et de la table temporaire
    	DECLARE @ChaineHTML varchar (8000)
    	DECLARE @adhnom nvarchar (200)
    	DECLARE @adhnum int
    	DECLARE @adhnum2 int
    	DECLARE @ouvnum int
            DECLARE @ouvtit nvarchar (200)
     
    	OPEN K
     
    	--Lecture du premier enregistrement
    	FETCH K
    		INTO @adhnom, @adhnum, @ouvnum, @ouvtit
     
    	-- Boucle de traitement
    	WHILE (@@FETCH_STATUS <> -1)
    	BEGIN
    		IF @ChaineHTML IS NULL
    			BEGIN
    				SET @ChaineHTML = CONVERT(nvarchar (200),''+@adhnom+' : <BR>'+@ouvtit+'')
    				SET @adhnum2 = @adhnum
    			END
    		ELSE
    			BEGIN
    				IF @adhnum = @adhnum2
    					BEGIN
    						SET @ChaineHTML = CONVERT(nvarchar (200),''+@ChaineHTML+'<BR>'+@ouvtit+'')
    					END
    				ELSE
    					BEGIN
    						SET @ChaineHTML = CONVERT(nvarchar (200),''+@ChaineHTML+'<BR>'+@adhnom+'<BR>'+@ouvtit+'')
    						SET @adhnum2 = @adhnum
    					END
    			END
    		-- Lecture de l'enregistrement suivant
    		FETCH K
    			]INTO @adhnom, @adhnum, @ouvnum, @ouvtit
    	END
     
    	-- Fermeture du curseur
    	CLOSE K
    	DEALLOCATE K
    	RETURN(@ChaineHTML)
     
    END

    Quelqu'un aurait-il une idée du pourquoi ce résultat? Et si possible une solution à mon problème?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Pourrais-tu indenter ton code, et alléger les print que cela devienne lisible ?
    Ensuite dis nous quelles variables perdent quelles valeurs seln toi.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut
    BEGIN
    -- Déclaration du curseur
    DECLARE K CURSOR FOR
    SELECT adhnom, adhnum, ouvnum, ouvtit
    FROM adherents, emprunts, ouvrages
    WHERE adhnum = eadhnum
    AND ouvnum = eouvnum
    ORDER BY adhnum

    -- Déclaration des variables et de la table temporaire
    DECLARE @ChaineHTML varchar (8000)
    DECLARE @adhnom nvarchar (200)
    DECLARE @adhnum int
    DECLARE @adhnum2 int
    DECLARE @ouvnum int
    DECLARE @ouvtit nvarchar (200)

    OPEN K

    --Lecture du premier enregistrement
    FETCH K
    INTO @adhnom, @adhnum, @ouvnum, @ouvtit

    -- Boucle de traitement
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    IF @ChaineHTML IS NULL
    BEGIN
    SET @ChaineHTML = CONVERT(nvarchar (200),''+@adhnom+' : <BR>'+@ouvtit+'')
    SET @adhnum2 = @adhnum
    END
    ELSE
    BEGIN
    IF @adhnum = @adhnum2
    BEGIN
    SET @ChaineHTML = CONVERT(nvarchar (200),''+@ChaineHTML+'<BR>'+@ouvtit+'')
    END
    ELSE
    BEGIN
    SET @ChaineHTML = CONVERT(nvarchar (200),''+@ChaineHTML+'<BR>'+@adhnom+'<BR>'+@ouvtit+'')
    SET @adhnum2 = @adhnum
    END
    END
    -- Lecture de l'enregistrement suivant
    FETCH K
    INTO @adhnom, @adhnum, @ouvnum, @ouvtit
    END

    -- Fermeture du curseur
    CLOSE K
    DEALLOCATE K
    RETURN(@ChaineHTML)

    END

    J'ai déjà trouver que du coup le RETURN ne veut pas d'une chaîne. Mais ça ne résout pas mon problème.

    @adhnom, @ouvtit perdaient leur valeur. Je dis bien perdaient car apparement ce n'est plus le cas ...

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    La balise Code (illustré par # dans l'interface de message)

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
          -- Déclaration du curseur
          DECLARE K CURSOR FOR
                 SELECT adhnom, adhnum, ouvnum, ouvtit
                 FROM adherents, emprunts, ouvrages
                 WHERE adhnum = eadhnum
                      AND ouvnum = eouvnum
                 ORDER BY adhnum
    
          -- Déclaration des variables et de la table temporaire
          DECLARE @ChaineHTML varchar (8000)
          DECLARE @adhnom nvarchar (200)
          DECLARE @adhnum int
          DECLARE @adhnum2 int
          DECLARE @ouvnum int
          DECLARE @ouvtit nvarchar (200)
    
          OPEN K
    
          --Lecture du premier enregistrement
          FETCH K
                INTO @adhnom, @adhnum, @ouvnum, @ouvtit
    
          -- Boucle de traitement
          WHILE (@@FETCH_STATUS <> -1)
          BEGIN
              IF @ChaineHTML IS NULL
                 BEGIN
                    SET @ChaineHTML = CONVERT(nvarchar (200),''+@adhnom+' : <BR>'+@ouvtit+'')
                    SET @adhnum2 = @adhnum
                 END
             ELSE
                BEGIN
                    IF @adhnum = @adhnum2
                        BEGIN
                           SET @ChaineHTML = CONVERT(nvarchar (200),''+@ChaineHTML+'<BR>'+@ouvtit+'')
                       END
               ELSE
                        BEGIN
                            SET @ChaineHTML = CONVERT(nvarchar (200),''+@ChaineHTML+'<BR>'+@adhnom+'<BR>'+@ouvtit+'')
                            SET @adhnum2 = @adhnum
                        END
              END
             -- Lecture de l'enregistrement suivant
             FETCH K
                  INTO @adhnom, @adhnum, @ouvnum, @ouvtit
        END
    
        -- Fermeture du curseur
       CLOSE K
       DEALLOCATE K
       RETURN(@ChaineHTML)
    
    END
    Et maintenant, je peux lire :p

    Bon, je vais peut-être dire une connerie, mais à ta place je remplacerais SET @ChaineHTML = par SELECT @ChaineHTML = pour voir.

    Mais sache qu'avec ton convert, tu limites ce qui sera mis dans ChaineHTML à 200 caractères. (peut-être souhaiterais-tu sortir @ChaineHTML de ce convert).

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut
    Merci, j'ai trouvé la solution: Je passe par une fonction au lieu d'une procédure.
    Tu as tout à fait raison pour la longueur de chaîne: je l'ai passé à 8000 (le max.).

    Après j'appelle avec ma couche métier (C#) une procédure stockée qui appelle la fonction (plus propre je trouve). La requête passe nickel (je la renvoi pour les autres au cas où):

    Fonction :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    CREATE FUNCTION [dbo].[ACFY_GetCurseurTextFunction]
    (
    )
    RETURNS varchar (8000)
    AS
     
    BEGIN
    	-- Déclaration du curseur
    	DECLARE K CURSOR FOR
    		SELECT adhnom, adhnum, ouvnum, ouvtit
    		FROM adherents, emprunts, ouvrages
    		WHERE adhnum = eadhnum
    			AND ouvnum = eouvnum
    		ORDER BY adhnum
     
    	-- Déclaration des variables et de la table temporaire
    	DECLARE @ChaineHTML varchar (8000)
    	DECLARE @adhnom nvarchar (200)
    	DECLARE @adhnum int
    	DECLARE @adhnum2 int
    	DECLARE @ouvnum int
    	DECLARE @ouvtit nvarchar (200)
     
    	OPEN K
     
    	--Lecture du premier enregistrement
    	FETCH K
    		INTO @adhnom, @adhnum, @ouvnum, @ouvtit
     
    	-- Boucle de traitement
    	WHILE (@@FETCH_STATUS = 0)
    	BEGIN
    		IF @ChaineHTML IS NULL
    			BEGIN
    				SET @ChaineHTML = CONVERT(varchar (8000),''+@adhnom+' : <BR>'+@ouvtit+'')
    				SET @adhnum2 = @adhnum
    			END
    		ELSE
    			BEGIN
    				IF @adhnum = @adhnum2
    					BEGIN
    						SET @ChaineHTML = CONVERT(varchar (8000),''+@ChaineHTML+'<BR>'+@ouvtit+'')
    					END
    				ELSE
    					BEGIN
    						SET @ChaineHTML = CONVERT(varchar (8000),''+@ChaineHTML+'<BR>'+@adhnom+'<BR>'+@ouvtit+'')
    						SET @adhnum2 = @adhnum
    					END
    			END
    		-- Lecture de l'enregistrement suivant
    		FETCH K
    			INTO @adhnom, @adhnum, @ouvnum, @ouvtit
    	END
     
    	-- Fermeture du curseur
    	CLOSE K
    	DEALLOCATE K
    	RETURN @ChaineHTML
    END
    Et voilà la procédure d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE PROCEDURE [dbo].[ACFY_GetCurseurText]
     
    AS
    DECLARE @ChaineFinale varchar (8000)
    BEGIN
    	SET @ChaineFinale = dbo.ACFY_GetCurseurTextFunction()
    	SELECT @ChaineFinale
    END
    Maintenant il me manque plus qu'a trouver une méthode C# pour appeler correctement ma procédure stockée et qu'elle me retourne ma chaîne, mais ça ne correspond plus à l'intitulé.

    Merci encore et à très bientôt!

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

Discussions similaires

  1. [PL/SQL] Déclaration de curseur
    Par pepin21 dans le forum SQL
    Réponses: 2
    Dernier message: 25/09/2006, 15h32
  2. PL/SQL :Retourner un curseur dans une procédure
    Par madina dans le forum PL/SQL
    Réponses: 1
    Dernier message: 24/05/2006, 17h36
  3. [PL/SQL] parcours de curseur
    Par NPortmann dans le forum Oracle
    Réponses: 20
    Dernier message: 20/05/2005, 21h51
  4. Réponses: 5
    Dernier message: 23/02/2005, 09h43
  5. [PL/SQL] SQL Dynamique et curseur
    Par Loko dans le forum Oracle
    Réponses: 10
    Dernier message: 23/11/2004, 16h18

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