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 :

[Procédure stockée] débutant


Sujet :

Développement SQL Server

  1. #1
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut [Procédure stockée] débutant
    Bonjour et bonne année 2009 à tous le monde,

    C'est la première fois que j'utilise les procédures stockées.
    Dans ma requête de selection je suis sûr qu'il y a des résultats que je voudrait insérer dans ma table temporaire. Mais mon souci lorsque j'execute ma procédure il me renvoi des résultats vides. et je n'ai aucun message d'erreur.
    Voici ma procédure :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    USE [lod]
    GO
    /****** Objet*:  StoredProcedure [dbo].[LIG_CptStck]    Date de génération du script*: 01/02/2009 10:51:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Laurent ODIE>
    -- Create date: <31/12/2008>
    -- Description:	<>
    -- =============================================
     
     
     
    ALTER PROCEDURE [dbo].[LIG_CptStck] 
    					@DatCde datetime
    AS
    BEGIN
    CREATE TABLE ##mvts_stock 
          (mvtorg CHAR(1),       
           mvttyp CHAR(10),      
           exeexe CHAR(4),       
           mvtdat DATETIME,      
           mvtnum INTEGER,       
           frnnumser CHAR(6),    
           frncod CHAR(6),       
           ufocod CHAR(4),       
           prdcod CHAR(7),       
           prdges CHAR(1),       
           mvtqte DECIMAL(12,3), 
           mvtpht DECIMAL(12,4), 
           mvtptc DECIMAL(12,4), 
           mvtmnt DECIMAL(12,2), 
           ctolbu CHAR(2),       
           ctonum CHAR(9),       
           mvtqsi DECIMAL(12,2), 
           mvtvsi DECIMAL(12,2)  
          );
    	--variable qui récupérera les données de la requête de sélection
    	DECLARE @mvtorg CHAR(1), @exeexe CHAR(4), @cdenum INTEGER, @frnnumser CHAR(6), @frncod CHAR(6),
    			@ufocod CHAR(4), @prdcod CHAR(7), @prdges CHAR(1), @mvtpht DECIMAL(12,4), @mvtptc DECIMAL(12,4),
    			@ctolbu CHAR(2), @ctonum CHAR(9), @cdedat DATETIME,@mvtqsi DECIMAL(12,2), @mvtvsi DECIMAL(12,2)
    	-- Cette variable sera toujours égal à 'C'
    	SET @mvtorg = 'C'
        --Déclaration de mon curseur
    	DECLARE MyCursor CURSOR 
    	FOR 
    		SELECT	cde.exeexe,cde.cdenum,frn.frnnumser,cde.frncod,cde.cdedat,
    				cdl.cdlcod as prdcod,prd.prdges, cdl.cdlpht,cdl.cdlptc,
    				cdl.ufocod, cdl.ctolbu, cdl.ctonum, imb.imbqsi, imb.imbvsi            
    		FROM dpcdl cdl, dpcde cde, fcprd prd, fcimb imb, fcfrn frn       
    		WHERE year(cde.cdedat) = @DatCde
    		AND cde.cdedat <= @DatCde     
    		AND cde.cdenumser = cdl.cdenumser AND cdl.cdltyp = 'P'
    		AND cdl.cdleta <> 'R' AND cdl.cdleta <> 'S'
    		AND cdl.cdlcodser = prd.prdnumser   AND prd.prdnumser = imb.prdnumser  
    		AND cde.exeexe = imb.exeexe   AND cde.frncod = frn.frncod
     
    		OPEN MyCursor -- j'initialise mon curseur 
    	-- je le rempli avec mon 1er enregistrement retourné par la requête 
    	FETCH NEXT FROM MyCursor INTO @exeexe, @cdenum, @frnnumser, @frncod, @cdedat, @prdcod,
    						@prdges, @mvtpht, @mvtptc, @ufocod, @ctolbu, @ctonum, 
    						@mvtqsi, @mvtvsi
    	-- Tant que je n'ai pas traité tous les variables de la requête 
    	WHILE @@fetch_Status = 0 
    	BEGIN
    		print @exeexe + '-' 
    		INSERT INTO ##mvts_stock 
    				(mvtorg,exeexe,mvtnum,frnnumser,frncod,ufocod, prdcod,
    				 prdges,mvtpht,mvtptc, ctolbu,ctonum,mvtdat,mvtqsi,mvtvsi)
             values (@mvtorg,@exeexe, @cdenum, @frnnumser, @frncod, @ufocod, @prdcod,
    				@prdges, @mvtpht, @mvtptc,  @ctolbu, @ctonum, @cdedat, @mvtqsi, @mvtvsi);
     
    		-- je le rempli avec les variables suivantes retourné par la requête
    		FETCH NEXT FROM MyCursor INTO @exeexe, @cdenum, @frnnumser, @frncod, @cdedat, @prdcod,
    						@prdges, @mvtpht, @mvtptc, @ufocod, @ctolbu, @ctonum, 
    						@mvtqsi, @mvtvsi 
    	END 
    	CLOSE myCursor -- je ferme mon curseur 
    	DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur
    	Select * from ##mvts_stock 
    end
    Pouvez vous m'aider ?

    Valoji

  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 761
    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 761
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    La code de votre proc est apparemment bon. En revanche j'ai de sérieux doute sur votre requête au niveau des jointures :

    Tant que vous ne ferez pas des jointures avec des JOIN (norme SQL datant de 1992, soit plus de 15 ans), vous aurez du mal à voir vos erreurs.

    Voici la requête rectifié et le doute que j'ai :

    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
    SELECT	cde.exeexe,cde.cdenum,frn.frnnumser,cde.frncod,cde.cdedat,
    		cdl.cdlcod AS prdcod,prd.prdges, cdl.cdlpht,cdl.cdlptc,
    		cdl.ufocod, cdl.ctolbu, cdl.ctonum, imb.imbqsi, imb.imbvsi            
    FROM dpcdl cdl
         INNER JOIN dpcde cde
               ON cde.cdenumser = cdl.cdenumser 
         INNER JOIN fcprd prd
               ON cdl.cdlcodser = prd.prdnumser
         INNER JOIN fcimb imb
               ON cde.exeexe = imb.exeexe AND prd.prdnumser = imb.prdnumser --> ??? cette double jointure (circulaire) est elle opportune ???
         INNER JOIN fcfrn frn       
               ON cde.frncod = frn.frncod
    WHERE year(cde.cdedat) = @DatCde
    AND cde.cdedat <= @DatCde     
    AND cdl.cdltyp = 'P'
    AND cdl.cdleta <> 'R' 
    AND cdl.cdleta <> 'S'
    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
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    J'ai bien modifié la requête, mais sans succés.

    Pour executer ma procédure je lui envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    USE [lod]
    GO
     
    DECLARE	@return_value int
     
    EXEC	@return_value = [dbo].[LIG_CptStck]
    		@DatCde = N'20/11/2008'
     
    SELECT	'Return Value' = @return_value
     
    GO
    Il me renvoi 2 résultat : Le résultat de select * from mvts_stock (Mais sans aucune occurence), ou je devrais normalement avoir des enregistrements

    et return value avec un occurence à 0.

    Valoji

  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 761
    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 761
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    Qu'espérez vous avoir dans le return value qui est le code d'erreur ?

    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
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Qu'espérez vous avoir dans le return value qui est le code d'erreur ?
    A +
    Return value me retourne bien 0, ce qui veut dire que ma procédure c'est bien passé.

    Mon souci, si vous reprenez ma requête plus haut, je crée ma table temporaire, je lui insére des données à partir de ma requête de selection. et ensuire je veut que ma procédure me renvoi le contenu de ma table temporaire (Ce que je n'arive pas à faire).

    Comme je vous dis, c la première fois que j'utilise les procédures stockées, soit je n'ai pas compris le principe ou soit je l'utilise mal.

    Merçi pour vos réponses

    Valoji

  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 : 42
    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,

    Quel résultat obtenez vous lorsque vous exécutez votre code sans l'encapsuler dans une procédure stockée ?

    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
    61
    62
    63
    CREATE TABLE ##mvts_stock 
          (mvtorg CHAR(1),       
           mvttyp CHAR(10),      
           exeexe CHAR(4),       
           mvtdat DATETIME,      
           mvtnum INTEGER,       
           frnnumser CHAR(6),    
           frncod CHAR(6),       
           ufocod CHAR(4),       
           prdcod CHAR(7),       
           prdges CHAR(1),       
           mvtqte DECIMAL(12,3), 
           mvtpht DECIMAL(12,4), 
           mvtptc DECIMAL(12,4), 
           mvtmnt DECIMAL(12,2), 
           ctolbu CHAR(2),       
           ctonum CHAR(9),       
           mvtqsi DECIMAL(12,2), 
           mvtvsi DECIMAL(12,2)  
          );
    	--variable qui récupérera les données de la requête de sélection
    	DECLARE @mvtorg CHAR(1), @exeexe CHAR(4), @cdenum INTEGER, @frnnumser CHAR(6), @frncod CHAR(6),
    			@ufocod CHAR(4), @prdcod CHAR(7), @prdges CHAR(1), @mvtpht DECIMAL(12,4), @mvtptc DECIMAL(12,4),
    			@ctolbu CHAR(2), @ctonum CHAR(9), @cdedat DATETIME,@mvtqsi DECIMAL(12,2), @mvtvsi DECIMAL(12,2)
    	-- Cette variable sera toujours égal à 'C'
    	SET @mvtorg = 'C'
        --Déclaration de mon curseur
    	DECLARE MyCursor CURSOR 
    	FOR 
    		SELECT	cde.exeexe,cde.cdenum,frn.frnnumser,cde.frncod,cde.cdedat,
    				cdl.cdlcod AS prdcod,prd.prdges, cdl.cdlpht,cdl.cdlptc,
    				cdl.ufocod, cdl.ctolbu, cdl.ctonum, imb.imbqsi, imb.imbvsi            
    		FROM dpcdl cdl, dpcde cde, fcprd prd, fcimb imb, fcfrn frn       
    		WHERE year(cde.cdedat) = @DatCde
    		AND cde.cdedat <= @DatCde     
    		AND cde.cdenumser = cdl.cdenumser AND cdl.cdltyp = 'P'
    		AND cdl.cdleta <> 'R' AND cdl.cdleta <> 'S'
    		AND cdl.cdlcodser = prd.prdnumser   AND prd.prdnumser = imb.prdnumser  
    		AND cde.exeexe = imb.exeexe   AND cde.frncod = frn.frncod
     
    		OPEN MyCursor -- j'initialise mon curseur 
    	-- je le rempli avec mon 1er enregistrement retourné par la requête 
    	FETCH NEXT FROM MyCursor INTO @exeexe, @cdenum, @frnnumser, @frncod, @cdedat, @prdcod,
    						@prdges, @mvtpht, @mvtptc, @ufocod, @ctolbu, @ctonum, 
    						@mvtqsi, @mvtvsi
    	-- Tant que je n'ai pas traité tous les variables de la requête 
    	WHILE @@fetch_Status = 0 
    	BEGIN
    		print @exeexe + '-' 
    		INSERT INTO ##mvts_stock 
    				(mvtorg,exeexe,mvtnum,frnnumser,frncod,ufocod, prdcod,
    				 prdges,mvtpht,mvtptc, ctolbu,ctonum,mvtdat,mvtqsi,mvtvsi)
             VALUES (@mvtorg,@exeexe, @cdenum, @frnnumser, @frncod, @ufocod, @prdcod,
    				@prdges, @mvtpht, @mvtptc,  @ctolbu, @ctonum, @cdedat, @mvtqsi, @mvtvsi);
     
    		-- je le rempli avec les variables suivantes retourné par la requête
    		FETCH NEXT FROM MyCursor INTO @exeexe, @cdenum, @frnnumser, @frncod, @cdedat, @prdcod,
    						@prdges, @mvtpht, @mvtptc, @ufocod, @ctolbu, @ctonum, 
    						@mvtqsi, @mvtvsi 
    	END 
    	CLOSE myCursor -- je ferme mon curseur 
    	DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur
    	SELECT * FROM ##mvts_stock
    Retenez aussi que l'utilisation de tables temporaires et de curseurs est contre-performante ...

    @++

  7. #7
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Quel résultat obtenez vous lorsque vous exécutez votre code sans l'encapsuler dans une procédure stockée ?
    )
    Je retrouve bien mes 11 enregistrements insérer dans ma table temporaire.

    Merci bien, j'ai trouvé mon erreur qui se trouvé au niveau de mon where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE year(cde.cdedat) = @DatCde
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE year(cde.cdedat) = year(@DatCde)
    Valoji

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  2. [Procédure stockée] Débutant
    Par diaboloche dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/11/2005, 18h58
  3. Réponses: 4
    Dernier message: 25/10/2005, 10h36
  4. [Débutant] Création de procédure stockée
    Par david71 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/06/2004, 18h19
  5. [Débutant] Procédures stockées
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/05/2004, 10h26

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