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 :

Appeler une procédure dans une procédure


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2023
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Appeler une procédure dans une procédure
    Bonjour,

    Je souhaite appeler une procédure dans une procédure.

    Supposons 3 procédures P1, P2 et P3 qui nécessitent respectivement une variable V1 , V2 et V3 pour qu'elles s'exécutent correctement.

    Comment puis-je faire pour qu'une procédure regroupe ces trois procédures (P1, P2 et P3) et que l'utilisateur puisse choisir d'éxecuter l'une d'entre elles ?

    Merci à vous!

    Romain

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est un peu léger en terme d'informations communiquées, mais avec des branchements IF sur vos paramètres vous devriez vous en sortir.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Dans le langage SQL :
    • une fonction ne doit en aucun cas modifier l'état de la base de données, que ce soit au niveau du DML (INSERT, UPDATE, DELETE...) ni au niveau du DDL (CREATE, ALTER, DROP...) ni même au niveau du DCL (GRANT, REVOKE...).
    • c'est le rôle d'une procédure de modifier l'état de la base de données d'une quelconque manière que ce soit...



    On ne peut donc pas appeler une procédure dans une fonction, ne serait-ce que pour des problème de sécurité... Hélas, certains SGBD mal conçus permettent cela (PostGreSQL en particulier) ce qui a conduit à la fille de sécurité https://wiki.postgresql.org/wiki/A_G...ur_Search_Path dont la plupart des serveurs actuels peuvent être victimes !

    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/ * * * * *

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2023
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Davantage de détails
    Bonjour,

    Comme c'est ma première procédure je galère un peu désolé pour la demande un peu vague au début.

    Je dispose de trois procédures :
    - CABYMONTH --> l'utilisateur doit préciser l'année en variable --> choix 1
    - CABYquarter --> l'utilisateur doit préciser l'année en variable --> choix 2
    - CA_BY_YEAR --> aucune variable --> choix 3

    Je souhaite que l'utilisateur choisisse une de ces options (1,2 ou3) en appelant une procédure qui appellera ensuite la procédure stockée.
    Autant j'ai compris comment créer une procédure mais pour qu'une procédure en appelle une autre je suis bloqué.
    Je tiens à préciser qu'il n'y a aucune modif de table dans mes procédures (code ci-dessous).

    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
    CREATE PROCEDURE CABYMONTH
     
    	@YEAR INT
     
    AS 
     
    select 
    CustomerName
    , month(Invoicedate) as Monthdate
     ,sum(SIL.QUANTITY * SIL.UnitPrice) as TotalInvoices
     
    from sales.Orders as SO
    LEFT JOIN Sales.OrderLines AS SOL on SO.OrderID=SOL.OrderID
    LEFT JOIN Sales.Invoices AS SI on SO.OrderID=SI.OrderID
    LEFT JOIN Sales.InvoiceLines as SIL  on SIL.InvoiceID=SI.InvoiceID 
    Left join sales.customers as SC on SO.CUSTOMERID=SC.CustomerID
     
    Where SI.InvoiceID is not null and SOL.StockItemID =SIL.StockItemID 
    and year(Invoicedate) =@YEAR
     
     
    Group by SC.CustomerName, month(Invoicedate)
     
    Order by SC.CustomerName, month(Invoicedate)
     
    GO
    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
     
    CREATE PROCEDURE CABYquarter
     
    	@YEAR INT
     
    AS 
     
    select 
    CustomerName
    , ((month(Invoicedate)+2)/3) as Monthdate
     ,sum(SIL.QUANTITY * SIL.UnitPrice) as TotalInvoices
     
    from sales.Orders as SO
    LEFT JOIN Sales.OrderLines AS SOL on SO.OrderID=SOL.OrderID
    LEFT JOIN Sales.Invoices AS SI on SO.OrderID=SI.OrderID
    LEFT JOIN Sales.InvoiceLines as SIL  on SIL.InvoiceID=SI.InvoiceID 
    Left join sales.customers as SC on SO.CUSTOMERID=SC.CustomerID
     
    Where SI.InvoiceID is not null and SOL.StockItemID =SIL.StockItemID 
    and year(Invoicedate) =@YEAR
     
     
    Group by SC.CustomerName, ((month(Invoicedate)+2)/3)
     
    Order by SC.CustomerName, ((month(Invoicedate)+2)/3)
    GO
    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
    CREATE PROCEDURE CA_BY_YEAR
     
    AS 
     
    select 
    CustomerName
    , YEAR(Invoicedate) as YEARdate
     ,sum(SIL.QUANTITY * SIL.UnitPrice) as TotalInvoices
     
    from sales.Orders as SO
    LEFT JOIN Sales.OrderLines AS SOL on SO.OrderID=SOL.OrderID
    LEFT JOIN Sales.Invoices AS SI on SO.OrderID=SI.OrderID
    LEFT JOIN Sales.InvoiceLines as SIL  on SIL.InvoiceID=SI.InvoiceID 
    Left join sales.customers as SC on SO.CUSTOMERID=SC.CustomerID
     
    Where SI.InvoiceID is not null and SOL.StockItemID =SIL.StockItemID 
     
    Group by SC.CustomerName, YEAR(Invoicedate)
     
    Order by SC.CustomerName, YEAR(Invoicedate)
     
    GO

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Donc, aucun intérêt de faire une procédure. Une simple et unique fonction table suffira et sera plus optimisée, surtout si elles doit être jointe avec d'autres tables, vues...

    D'autre part vous avez mélangé les jointures JOIN ON et le WHERE...
    Vous annulez les jointures externes avec votre clause WHERE !

    Donc en une seule 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
    CREATE FUNCTION dbo.F_CA_BY (@DATEPART VARCHAR(16), @YEAR INT)
    RETURNS TABLE
    AS 
    SELECT CustomerName,
           @YEAR AS YEAR_DATE,
           CASE @DATEPART 
              WHEN 'year'    THEN YEAR(Invoicedate) 
              WHEN 'quarter' THEN DATEPART(quarter, Invoicedate) 
              WHEN 'month'   THEN MONTH(Invoicedate) 
           END as YEAR_PART,
           sum(SIL.QUANTITY * SIL.UnitPrice) as TotalInvoices
    FROM   sales.Orders as SO
           JOIN Sales.OrderLines AS SOL 
              ON SO.OrderID=SOL.OrderID
           JOIN Sales.Invoices AS SI 
              ON SO.OrderID=SI.OrderID
           JOIN Sales.InvoiceLines AS SIL  
              ON SIL.InvoiceID=SI.InvoiceID 
                 AND SOL.StockItemID =SIL.StockItemID --> ce que vous aviez mis dans le WHERE est qui fait partit de la jointure !
           JOIN sales.customers AS SC 
             ON SO.CUSTOMERID=SC.CustomerID
    WHERE  SI.InvoiceID IS NOT NULL
           AND YEAR(Invoicedate) =@YEAR
    GROUP  BY SC.CustomerName, 
           CASE @DATEPART 
              WHEN 'year'    THEN YEAR(Invoicedate) 
              WHEN 'quarter' THEN DATEPART(quarter, Invoicedate) 
              WHEN 'month'   THEN MONTH(Invoicedate) 
          END;
    GO
    Que vous pouvez utiliser comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM    dbo.F_CA_BY('quarter', 2020)
    ORDER  BY CustomerName, YEAR_PART;
    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/ * * * * *

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2023
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Problème dans la procédure
    Nom : FUNCTION.jpg
Affichages : 88
Taille : 95,7 Ko

    J'ai ce problème la quand je tente de créer la fonction. J'ai essayé de corriger mais j'avoue que je suis perdu. Pourriez vous m'aider svp ?

    "Vous annulez les jointures externes avec votre clause WHERE !" --> Merci beaucoup je n'y avais pas pensé!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Il manque juste le mot clé RETURN entre le AS et le SELECT.

    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/ * * * * *

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2023
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Merci!
    Merci beaucoup!

    J'ai beaucoup appris avec ton code et je te remercie vraiment d'avoir pris le temps de le faire!

    Bonne journée

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/01/2008, 11h59
  2. Comment appeler une procédure dans une autre unité ?
    Par michel71 dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2007, 16h27
  3. Réponses: 4
    Dernier message: 28/08/2006, 13h04
  4. Réponses: 3
    Dernier message: 17/01/2006, 17h12
  5. Appel de procédure dans une page ASP
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 02/04/2004, 16h59

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