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

Langage SQL Discussion :

Traiter une procédure stocké dans une autre


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut Traiter une procédure stocké dans une autre
    Bonjour.

    Alors voila!!! J'ai un problème : ...

    -J'ai une procédure stocké d'insertion de produit.

    -Une fois le produit inséré je souhaite affecté un jambon à ce produit.

    -Pour cela je veux récupérer le numéro auto du produit insérer à l'instant.

    -Une fois ce numéro récupérer je peu inseré mon jambon avec la référence au produit.

    Voici donc ma procédure Stocké :
    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
     
    CREATE PROCEDURE PS_AjoutProduit
       @ListeValeurs varchar(8000),
       @ListeChamps varchar(8000),
       @ListeValeursJambon varchar(8000),
       @ListeChampsjambon varchar(8000)
    AS
    BEGIN
     
    	DECLARE @MA_REQUETE VARCHAR(8000)
    	DECLARE @PK_IDProd INT
     
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
    	--On commence la transaction
    	BEGIN TRANSACTION Insertion
     
    	--on insère les PRODUITS
    	IF((@ListeValeurs <>'NULL')AND(@ListeChamps <>'NULL'))Begin
    		-- On insert le produit dans la table
    		SET @MA_REQUETE='INSERT INTO TD_Produits ('+ @ListeChamps +')VALUES('+ @ListeValeurs +')'
    		EXEC (@MA_REQUETE)
    	End
     
    	--on insère les JAMBONS
    	IF((@ListeValeursJambon<>'NULL')AND(@ListeChampsJambon<>'NULL'))Begin
    		-- on récupère le PK_IDProd (numéro auto du produit) maximum dans la table TD_Produits
    		SELECT @PK_IDProd = PS_MAX_IDProd 
     
    		-- on insert dans la table de jambon
                    .....
    	End
     
    	--on vérifie si il n'y à pas eu d'erreur pendant l'execution des requetes. Si oui on annule tout
    	IF (@@error <> 0) ROLLBACK TRANSACTION Insertion
    	else COMMIT TRANSACTION Insertion
     
    END
    La procédure "PS_MAX_IDProd " est bien créée est elle me renvoie bien la bonne valeur quand je la test.

    Cependant j'ai le message d'erreur "PS_MAX_IDProd nom de fonction incorrect" ...

    Est-ce que quelqu'un pourrai m'expliquer comment on appel une procédure stockée dans une autre et comment récupérer son résultat ?

    ...

    Merci d'avance et bonne journée

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Pour avoir une valeur de retour, le mieux est de passer une variable output en paramètre, non ?

  3. #3
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    Bin voici la procédure stocké dont je veux récupérer le résultat :
    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
     
    CREATE PROCEDURE PS_MAX_IDProd
    	-- Add the parameters for the stored procedure here
    	@PK_IDProd INT OUTPUT
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for procedure here
    	SELECT @PK_IDProd =(SELECT Max(PK_IDProd)FROM TD_Produits)
     
    	RETURN @PK_IDProd
    END
    J'ai aussi essaié l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PS_MAX_IDProd (@PK_IDProd)
    Mais rien ne fait.

    Merci tout de même.

    Vois tu autre choses qui irait pas dans mes procédures?

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @TaVariable = SELECT...
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT @TaVariable = SELECT...

  5. #5
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    Merci de ton aide

    Mais ça ne fonctionne toujours pas ...

    En fait ma fonction PS_MAX_IDProd fonctionne bien. Je l'essaie et elle me retourne la bonne valeur avec l'exécuteur de Procédures stocké de Sql Server management studiot express.

    Je pense que mon erreur vient de son appel.
    J'ai essaié les synthaxes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET @PK_IDProd = PS_MAX_IDProd (0) -- => "n'est pas un nom de fonction reconnue"
    SELECT @PK_IDProd = PS_MAX_IDProd (0) -- => "n'est pas un nom de fonction reconnue"
    PS_MAX_IDProd (@PK_IDProd) -- =>"Syntahxe incorect vers PS_MAX_IDProd"
    PS_MAX_IDProd @PK_IDProd -- =>"Syntahxe incorect vers PS_MAX_IDProd"
    SET PS_MAX_IDProd (@PK_IDProd) -- =>"Syntahxe incorect vers ("
    SET PS_MAX_IDProd @PK_IDProd -- =>"'PS_MAX_IDProd' n'est pas un Instruction SET reconnu"
    SELECT PS_MAX_IDProd @PK_IDProd -- =>"Syntahxe incorect vers @PK_IDProd"
    SELECT PS_MAX_IDProd (@PK_IDProd) -- =>"n'est pas une fonction reconnue"
    J'avoue ne pas avoir plus d'idée pour l'appel.
    Tu vois d'où est le problème? ... ...

    Encore merci de ton aide en tout cas!!!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Pour appeler une PS sous SQL Server et récuperer un parametre output ce serait plutot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    declare @valeurRetour int
    exec @valeurRetour =PS_MAX_IDProd @PK_IDProd  output
    Dans @valeurRetour tu obtiens le return de ta PS
    et dans @PK_IDProd la valeur de ta variable output.
    Mais Ta PS PS_MAX_IDProd est une mauvaise idée.
    Voir l'article de SQL pro sur les clés autoincrémentés.
    http://sqlpro.developpez.com/cours/clefs/#L3.1
    de plus le SQL dynamique n'est pas du tout performant.

    A+
    Soazig

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     EXECUTE PS_MAX_IDProd @PK_IDProd

  8. #8
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    MERCI à tous les deux!!!!!!!!
    Tout fonctionne ...

    Juste une petite remarque :
    Comment cela ce fait-il que le SQL dynamique soit moins performant? (un petit lien vers une source de nouvelles connaissances serait la bien venu )

    J'avoue ne pas comprendre pourquoi le fait de récupérer le dernier numéro auto est mauvais.
    => En fait je ne réutilise JAMAIS un numéroauto déja associé!!! (sinon c'est plus un vrai incrément ).
    =>De plus étant un BigInt il a le temps avant de dépacer les limites.
    =>Enfin le fait d'utiliser des transactions vérouille la table le temps de l'opération normalement non? Si oui aucun risque que le numéro soit modifié par quelqu'un d'autre quelque ième de seconde trop tôt (sans compter le fait qu'il n'y aura qu'une personne qui s'occupera de l'insertion... )

    En tout cas MERCI à vous

    P.S : si je viens de dire des co***ries ne pas hésiter à me reprendre!!!

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    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 858
    Points : 52 996
    Points
    52 996
    Billets dans le blog
    6
    Par défaut
    Comment cela ce fait-il que le SQL dynamique soit moins performant? (un petit lien vers une source de nouvelles connaissances serait la bien venu )
    Tout simplement parce que le code n'étant pas définition pas connu préalablement il faut le recompiler pour chaque exécution. D'ou une moins bonne persistance dans le cache ...

    J'avoue ne pas comprendre pourquoi le fait de récupérer le dernier numéro auto est mauvais.
    => En fait je ne réutilise JAMAIS un numéroauto déja associé!!! (sinon c'est plus un vrai incrément ).
    =>De plus étant un BigInt il a le temps avant de dépacer les limites.
    =>Enfin le fait d'utiliser des transactions vérouille la table le temps de l'opération normalement non? Si oui aucun risque que le numéro soit modifié par quelqu'un d'autre quelque ième de seconde trop tôt (sans compter le fait qu'il n'y aura qu'une personne qui s'occupera de l'insertion... )
    Tout ceci est faux. Je l'ai démontré mainte fois. Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/clefs/

    A +

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

Discussions similaires

  1. Appel d'une procédure stockée dans une autre.
    Par saymon dans le forum Développement
    Réponses: 6
    Dernier message: 19/05/2009, 12h17
  2. Réponses: 3
    Dernier message: 30/12/2008, 09h33
  3. Réponses: 7
    Dernier message: 18/01/2008, 18h01
  4. Appel d'une procédure stockée dans une procédure stockée
    Par MrEddy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/09/2006, 16h17
  5. Réponses: 3
    Dernier message: 17/01/2006, 17h12

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