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

MS SQL Server Discussion :

Valeur de retour, procédures stockées


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant (domaine de prédilection java)
    Inscrit en
    Mars 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant (domaine de prédilection java)
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 71
    Points : 62
    Points
    62
    Par défaut Valeur de retour, procédures stockées
    Bonjour à tous,
    ça fait un moment que j'ai découvert comment simplifier mon code côté client en utilisant des Vues+Trigger+ procédures stockées.
    Je voudrais savoir comment faire pour qu'une procédure stockée(lors d'une insertion par exemple) puisse me renvoyer le nombre d'enregistrements effectués, ou alors me renvoyer le message d'erreur qui s'affiche généralement dans la console ssms lorsque les choses se sont mal passées.
    Quand je parle de "renvoyer", c'est bien sûr parce que dans mon code client, je voudrais faire des tests sur la valeur de retour...
    Voilà, je sais pas si j'ai été clair, j'attend vos contributions

  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
    Points : 1 234
    Points
    1 234
    Par défaut
    Vous pouvez avoir des paramètre de type "OUT" qui vous permette après y avoir assigné des valeurs dans les procédures stockées, de récupérer ces dernières lors de vos appels.

  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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Lorsqu'un module T-SQL produit une erreur à l'exécution, il retourne une valeur différente de zéro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE PROCEDURE test_erreur
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	SELECT 1 / 0
    END
    GO
     
    DECLARE @r INT
     
    EXEC @r = dbo.test_erreur
     
    SELECT @r
    Le dernier SELECT de cet exemple retourne -6.

    Si l'on souhaite obtenir le numéro de l'erreur, il faut gérer l'erreur avec un contrôle TRY ... CATCH :

    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
    ALTER PROCEDURE test_erreur
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	BEGIN TRY
    		SELECT 1 / 0
    	END TRY
    	BEGIN CATCH
    		RETURN ERROR_NUMBER()
    	END CATCH
    END
    GO
     
    DECLARE @r INT
     
    EXEC @r = dbo.test_erreur
     
    SELECT @r
    Ici @r vaut 8314.

    Notez que dans ces exemples, on ne capture pas le libellé de l'erreur, ce qui est dommage.
    D'autre part, si vous êtes dans une transaction, ce qui est le cas dans un avec un trigger par exemple, il faut vérifier qu'il n'en existe pas d'ouverte après l'erreur, à l'aide de la fonction XACT_STATE().
    Enfin pour certaines erreurs, il est intéressant d'avoir sont état, qui est donné par la fonction ERROR_STATE().

    @++

  4. #4
    Membre du Club
    Homme Profil pro
    Etudiant (domaine de prédilection java)
    Inscrit en
    Mars 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant (domaine de prédilection java)
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    Merci tout le monde,
    Elsuket, ce que tu dis me fait penser à ce que j'ai lu sur le site de microsoft au sujet de la variable @errno (je me souviens plus bien du nom...). En fait ceci ne correspond pas vraiment à ce que je voudrais, ou juste partiellement.
    Voila, j'ai au sein de mon code java une méthode InsererVue(champ1, champ2, champ3, champ4, champ5) qui comme son nom l'indique va déclencher une insertion dans une vue. Les champs 1, 2...5 ne sont pas forcément de la même table, d'où l'utilisation d'un trigger Instead of pour rendre cela plus transparent pour l'utilisateur, et éviter les messages d'erreurs. Le trigger va faire appel à une procédure stockée pour dispatcher les infos dans les tables appropriées(Je sais, ça sent un peu l'école de SQLPro ça ), en prenant soin de n'insérer une ligne que si elle n'existe pas déjà, et c'est là où intervient mon problème. Disons que j'ai une boucle qui va récupérer des infos d'un fichier et les insérer grâce à ma méthode présentée plus haut; j'aimerais obtenir à la fin le nombre exact de lignes effectivement insérées. Ce n'est pas un problème d'algorithme, je sais comment implémenter ça, mais comment "retourner" cette précieuse valeur à mon programme?

  5. #5
    Membre du Club
    Homme Profil pro
    Etudiant (domaine de prédilection java)
    Inscrit en
    Mars 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant (domaine de prédilection java)
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    En fait, j'ai fini par résoudre mon problème:
    c'est tout con en fait, mais fallait y penser. je laisse le trigger de côté, je modifie ma procédure stockée pour avoir des paramètres OUT, et dans mon code client j'appelle directement ma procédure stockée et je récupère le paramètre de sortie que je pourrai ensuite traiter comme bon me semble... Merci à tous!!

  6. #6
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    je laisse le trigger de côté, je modifie ma procédure stockée pour avoir des paramètres OUT, et dans mon code client j'appelle directement ma procédure stockée et je récupère le paramètre de sortie que je pourrai ensuite traiter comme bon me semble
    Exact, c'est ce que je pense être le plus propre.

    Pour connaître le nombre de ligne affectées par l'instruction T-SQL précédente, il suffit d'utiliser @@ROWCOUNT

    @++

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    N'est-ce pas exactement la première réponse que vous avez reçu ?
    Citation Envoyé par Sergejack Voir le message
    Vous pouvez avoir des paramètre de type "OUT" qui vous permette après y avoir assigné des valeurs dans les procédures stockées, de récupérer ces dernières lors de vos appels.

  8. #8
    Membre du Club
    Homme Profil pro
    Etudiant (domaine de prédilection java)
    Inscrit en
    Mars 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant (domaine de prédilection java)
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    Euh...waldarexactement je crois pas, non!!, presque exactement, évidemmenttoutes les réponses m'ont mis sur la bonne voie, et c'est pourquoi j'ai tenu à remercier tout le monde!! quand on me parle de "OUT", moi je pense à fonction (en tout bon néophyte t-sql) avec type de retour et je fais cette recherche sur google où je tombe sur des liens et d'autres et je finis par comprendre ENFIN complètement la première réponse.
    Encore une fois, merci elsuket , merci sergejack et merci à toi aussi waldar

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/06/2009, 13h48
  2. Réponses: 1
    Dernier message: 23/08/2008, 01h32
  3. Réponses: 2
    Dernier message: 21/05/2008, 19h44
  4. [MySQL] Récupérer la valeur d'une procédure stockée
    Par spaukensen dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 20/03/2008, 11h44
  5. Réponses: 1
    Dernier message: 14/03/2008, 11h48

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