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 :

Procédure SQL avec paramètre entrée et paramètre sortie


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut Procédure SQL avec paramètre entrée et paramètre sortie
    Bonjour,

    Je suis en train d'écrire une procédure qui doit retourner le montant (paramètre de sortie) de la dernière commande à un fournisseur donné (paramètre en entrée).

    J'ai une table FOURNIS(PK_NUMFOU NUMBER (numéro fournisseur), NOMFOU VARCHAR2 (nom fournisseur)), une table COMMANDE (PK_NUMCOM NUMBER(numéro commande), #NUMFOU NUMBER(numéro fournisseur), DATCOM DATE(date commande)) et une table LIGCOM(#NUMCOM NUMBER(numéro commande), #CODART NUMBER (code artcile), NUMLIG NUMBER(numéro de ligne de commande), QTECDE NUMBER(quantitée commandée), PRINUI NUMBER(prix unitaire)). LIGCOM étant une jointure entre une table PRODUIT(non détaillée ici) et la table COMMANDE.

    Donc la dernière commande, c'est le NUMCOM où NUMFOU (numéro fournisseur) est égal au paramètre passé en entrée de la procédure et où DATCOM = MAX(DATCOM) du fournisseur NUMFOU (égal au paramètre passé en entrée de la procédure).

    Ensuite, il me faut récupérer toutes les lignes de LIGCOM où figure le NUMCOM récupéré ci-dessus pour faire la somme des produits de la quantité d'articles par le prix unitaire (SUM(QTECDE * PRIUNI)).

    Pour cela, j'ai écrit ceci mais je rame :

    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
    CREATE OR REPLACE PROCEDURE PROC_MONTANT 
    (
      FOU IN NUMBER 
    , MONT OUT NUMBER 
    ) AS
     
    num_fou commande.numfou%TYPE;
    montant_comm NUMBER;
    command NUMBER;
     
    CURSOR cur_com (foucur NUMBER) IS
      SELECT c.NUMCOM FROM COMMANDE c
      WHERE c.NUMFOU = foucur AND c.DATCOM = (SELECT MAX(c1.DATCOM) FROM COMMANDE c1 WHERE c1.NUMFOU = foucur);
     
    BEGIN
      OPEN cur_com(foucurs);
     
      FETCH cur_com INTO command;
     
      SELECT SUM(PRIUNI*QTECDE)
      FROM LIGCOM
      WHERE NUMCOM = command;
    END PROC_MONTANT;
    Je vous remercie d'avance pour votre aide !

  2. #2
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    En TSQL, cela donnerait quelque chose de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT @MONT = SUM(PRIUNI*QTECDE)
    FROM LIGCOM
            JOIN (
                    SELECT MAX(DATCOM) , NUMCOM
                    FROM COMMANDE
                    WHERE NUMFOU = @FOU 
                    ) C
            ON LIGCOM.NUMCOM = C.NUMCOM

    J'espère que cela va t'aider.
    ! Attention si le fournisseur a plus d'une commande par jour !

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut SAL oracle
    Bonjour et merci pour cette response.

    Le code que je souhaite obtenir est du SQL oracle.

    Je vais voir avec le TSQL --> malheureusement le TSQL ne fonctionne pas sous oracle.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bon, j'ai trouvé ma solution :

    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
    create or replace PROCEDURE PROC_MONTANT 
    (
      FOU IN NUMBER 
    , MONT OUT NUMBER 
    ) AS
     
    command NUMBER;
     
    CURSOR cur_com (foucur NUMBER) IS
      SELECT c.NUMCOM FROM COMMANDE c
      WHERE c.NUMFOU = foucur AND c.DATCOM = (SELECT MAX(c1.DATCOM) FROM COMMANDE c1 WHERE c1.NUMFOU = foucur);
     
    BEGIN
      OPEN cur_com(FOU);
     
      FETCH cur_com INTO command;
     
      SELECT SUM(PRIUNI*QTECDE) INTO MONT
      FROM LIGCOM
      WHERE NUMCOM = command;
     
    END PROC_MONTANT;
     
    /*code pour appeler cette procédure :
    ***************************************
     
    SET SERVEROUTPUT ON;
    DECLARE MONTANT INTEGER;
    BEGIN
      PROC_MONTANT(120, MONTANT);
      dbms_output.put_line('montant : ' || MONTANT);
    END;
    */
    Merci !!!

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez le faire directement avec une requête, sans passer par un curseur.

    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WITH CTE AS(
        SELECT 
            SUM(PRIUNI*QTECDE) As Montant
            ,ROW_NUMBER() OVER(ORDER BY DATCOM DESC) AS Rn
        FROM COMMANDE c
        INNER JOIN LIGCOM l
            ON l.NUMCOM = c.PK_NUMCOM
        WHERE NUMFOU = FOU
        GROUP BY PK_NUMCOM, DATCOM 
    )
    SELECT Montant
    FROM CTE
    WHERE Rn = 1

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Merci bien !

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    Une autre solution intégrant des exceptions !

    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
    create or replace PROCEDURE MONTANT_DER_COM_ERROR(num_fou IN NUMBER, montant OUT NUMBER) IS 
      num_com NUMBER;
      nbr_four NUMBER;
      pas_de_fournisseur EXCEPTION;
    BEGIN
     
    -- REQUETE QUI VA VERIFIER L'EXISTANCE DU NUMERO DE FOURNISSEUR
      SELECT COUNT(*) INTO nbr_four 
      FROM FOURNIS 
      WHERE NUMFOU = num_fou;
    -- SI LA VARIABLE nbr_four (INITIALISEE AVEC LE INTO DE LA REQUETE PRECEDENT) EST EGALE A ZERO
    -- ALORS IL Y A UNE ERREUR
      IF nbr_four < 1 THEN
      RAISE pas_de_fournisseur;
      END IF;
     
    -- EXECUTION DE L'INSTRUCTION PRINCIPALE  
      SELECT C.NUMCOM INTO num_com
      FROM COMMANDE C
      WHERE C.NUMFOU = num_fou AND ROWNUM <= 1 
      ORDER BY C.NUMCOM DESC;
     
      SELECT SUM(L.QTELIV*L.PRIUNI) INTO montant
      FROM LIGCOM L  WHERE L.NUMCOM = num_com;
     
    -- TRAITEMENT DES EXCEPTIONS
    EXCEPTION
      WHEN pas_de_fournisseur THEN
      DBMS_OUTPUT.PUT_LINE('Ce numero de fournisseur n existe pas');
    --  WHEN NO_DATA_FOUND THEN
    --  DBMS_OUTPUT.PUT_LINE('Ce numero de fournisseur n existe pas');
    END MONTANT_DER_COM_ERROR;
     
    /*code pour appeler la procédure
    ********************************
     
    SET SERVEROUTPUT ON;
    DECLARE MONTANT INTEGER;
    BEGIN
    MONTANT_DER_COM_ERROR('120', MONTANT);
    dbms_output.put_line('montant : ' || MONTANT);
    END;
    */

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/01/2011, 15h45
  2. Procédure stocké avec un ORDER BY paramétrable
    Par Erakis dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 10/11/2005, 14h12
  3. Procédure stockée avec serveur lié et paramètres
    Par AITOZ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2005, 17h51
  4. [Débutant]Procédure avec paramètres entrée / sortie
    Par jeromejanson dans le forum Langage
    Réponses: 13
    Dernier message: 10/10/2005, 08h30
  5. Réponses: 2
    Dernier message: 16/08/2005, 15h33

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