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 :

Facon + propre de faire un DEALLOCATE cursor


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut Facon + propre de faire un DEALLOCATE cursor
    Bonjour,

    le problème est le suivant:
    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
    BEGIN TRY
    	BEGIN TRAN 
     
    		...
     
    		BEGIN TRY
    			DEALLOCATE load_cursor
    		END TRY	BEGIN CATCH	END CATCH
     
    		DECLARE load_cursor CURSOR FOR
    			SELECT ...
     
    		OPEN load_cursor
    			FETCH NEXT FROM load_cursor INTO @par_name
     
    			WHILE @@FETCH_STATUS = 0
    			BEGIN
    				...
    				FETCH NEXT FROM load_cursor INTO @par_name
    			END
    		CLOSE load_cursor
    		DEALLOCATE load_cursor
     
    		....
    	COMMIT TRAN ;
    END TRY
    BEGIN CATCH
    		BEGIN TRY
    			DEALLOCATE load_cursor
    		END TRY	BEGIN CATCH	END CATCH
    	ROLLBACK TRAN 
    	 .....
    END CATCH
    Y a t-il moyen de savoir si le curseur a été alloué ou pas
    pour éviter ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		BEGIN TRY
    			DEALLOCATE load_cursor
    		END TRY	BEGIN CATCH	END CATCH
    Je trouve cette méthode trop bourrin, mias je n'arrive pas à trouver l'exemple ou on fait un DEALLOCATE conditionnel.

    Je ne sais pas si j'étais assez clair.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    CURSOR_STATUS
    (
    { type , 'cursor_name' }
    | { 'variable' , 'cursor_variable' }
    )
    avec type ::= { local| global }

    renvoi :
    1
    Le jeu de résultats du curseur comprend au moins une ligne et :
    pour les curseurs non et les clés sensitifs, le jeu de résultats comprend au moins une ligne ;
    pour les curseurs dynamiques, le jeu de résultats peut être vide, ou contenir une ou plusieurs lignes.
    Le curseur affecté à cette variable est ouvert et :
    pour les curseurs non et les clés sensitifs, le jeu de résultats comprend au moins une ligne ;
    pour les curseurs dynamiques, le jeu de résultats peut être vide, ou contenir une ou plusieurs lignes.

    0
    Le jeu de résultats du curseur est vide.* Le curseur affecté à cette variable est ouvert mais le jeu de résultats est vide.*

    -1
    Le curseur est fermé. Le curseur affecté à cette variable est fermé.

    -2
    Valeurs possibles :
    Aucun curseur n'a été affecté à cette variable OUTPUT lors du précédent appel de la procédure.
    Un curseur a été affecté à cette variable OUTPUT lors du précédent appel de la procédure mais il était fermé pendant le déroulement de celle-ci. C'est la raison pour laquelle le curseur est désaffecté et qu'il n'est pas renvoyé à la procédure d'appel.
    Aucun curseur n'est affecté à une variable de curseur déclarée.

    -3
    Aucun curseur avec le nom spécifié n'existe. Il n'existe aucune variable de curseur portant le nom spécifié ou si c'est le cas, aucun curseur ne lui a encore été affecté.


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Ou encore, si vous êtes sous SQL Server 2005, vous pouvez tester l'existence du curseurs pour la session en cours en passant en paramètre votre SPID (@@SPID) à la fonction de gestion dynamique sys.dm_exec_cursors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IF EXISTS
    (
    	SELECT *
    	FROM sys.dm_exec_cursors(@@SPID)
    	WHERE name = 'monCurseur'
    )
    DEALLOCATE monCurseur
    @++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Là par contre, je me risquerais pas à cette solution... par ce que les privilèges de l'utilisateur peuvent lui interdire la vision des dm !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Exact, je n'y avais pas pensé

    @++

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    CURSOR_STATUS
    (
    { type , 'cursor_name' }
    | { 'variable' , 'cursor_variable' }
    )
    avec type ::= { local| global }

    A +
    Merci. En faite je vais créer des curseurs locaux donc plus de problèmes de lorsqu'on quitte la procedure.

    Sinon le test cursor_status > -2 est la meilleure solution

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/06/2014, 16h05
  2. [MySQL] Mysql et savoir faire (la facon propre?)
    Par japower01 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/11/2011, 15h53
  3. deallocate cursor avec forms
    Par formsforms dans le forum Forms
    Réponses: 0
    Dernier message: 11/12/2007, 15h14
  4. programmer en Java de facon propre,optimisée
    Par thierry_b dans le forum Langage
    Réponses: 3
    Dernier message: 14/09/2007, 09h42
  5. Une manière propre de faire un ftoa en C
    Par bulki dans le forum C
    Réponses: 8
    Dernier message: 21/05/2007, 10h44

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