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

DB2 Discussion :

Créer une table dans une procédure stockée


Sujet :

DB2

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 98
    Points : 69
    Points
    69
    Par défaut Créer une table dans une procédure stockée
    Bonjour,
    Un truc bête; comment créer simplement une table a partir d'u résulat d'un select ? avec 3 paramètres en entrée

    [CODE]
    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                                                   
    ATDCETUD.PR_ARCH06(IN Pyear dec(4, 0), IN PDivi char(3), IN Pbib char(10))     
    
     LANGUAGE SQL                             
      BEGIN                                   
        DECLARE stmt varchar(1500);           
        DECLARE SQLCODE INTEGER DEFAULT 0;    
        DECLARE CSR1 CURSOR FOR sqlstm1;      
    
    Set stmt =                                                                       
    'CREATE TABLE BIBTST/CUMCPTGENE AS( '||                                         
    'SELECT EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER,  
    EAAICL, SUM(EGACAM) as Solde  FROM FGLEDG, FCHACC                                
    WHERE EGCONO = EACONO AND EGAIT1 = EAAITM AND EGCONO = 100 AND                   
    EGDIVI ='''||PDIVI||''' AND EAAITP=1 AND EADIVI ='||'''   '' AND                 
      EGYEA4=' ||PYEAR|| ' AND EGFEID<>'||'''GL99''                                  
    GROUP BY EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER, 
    EAAICL HAVING SUM(EGACAM)    <> 0) WITH DATA';      
    
    
       PREPARE sqlstm1 FROM stmt;
     marche pas(L'instruction préparée CSR1 n'a pas été trouvée. )==>  execute CSR1;              
    END

    Apres j'ai essayé ça


    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 OR REPLACE PROCEDURE                                                      
    ATDCETUD.PR_ARCH06T(IN Pyear dec(4, 0), IN PDivi char(3), IN PBib char(10))      
                                                                                     
    LANGUAGE SQL                                                                     
     BEGIN                                                                           
     
    CREATE TABLE PBIB/CUMCPTGENE AS(                                              
    SELECT EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER,   
    EAAICL, SUM(EGACAM) as Solde  FROM FGLEDG, FCHACC                                
    WHERE EGCONO = EACONO AND EGAIT1 = EAAITM AND EGCONO = 100 AND                   
    EGDIVI = PDivi   and EAAITP=1 AND EADIVI ='   '                                  
    GROUP BY EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER, 
    EAAICL HAVING SUM(EGACAM) <> 0) WITH DATA;                                       
    END
    et ce message:
    SQL0312 Gravité 30. Enregistrement 11. Position 10
    Message . . . . : Variable PDIVI non définie ou non utilisable.

    Quelqu'un a une idée? car je ne veux pas créer de table avant pour faire ensuite un insert
    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    C'était tout con; ya peut être plus court mais ça marche
    1/ création de ma table avec une valeur qui me donnera un fichier vide
    2/ l'insert

    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
    CREATE OR REPLACE PROCEDURE                                                      
    ATDCETUD.PR_ARCH06(IN Pyear dec(4, 0), IN PDivi char(3), IN PBib char(10))       
    LANGUAGE SQL                                                                     
     BEGIN                                                                           
    -------------------------------------------------------------------------------- 
    CREATE TABLE QTEMP/CUMCPTGENE AS(                                                
    SELECT EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER,   
    EAAICL, SUM(EGACAM) as Solde  FROM FGLEDG, FCHACC                                
    WHERE EGCONO = EACONO AND EGAIT1 = EAAITM AND EGCONO = 100 AND                   
    EGDIVI = 'XXX'    and EAAITP=1 AND EADIVI ='   '                                 
    GROUP BY EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER, 
    EAAICL HAVING SUM(EGACAM) <> 0) WITH DATA;                                       
    --                                                                               
      Insert Into QTEMP.CUMCPTGENE                                                   
      SELECT EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER, 
      EAAICL, SUM(EGACAM) as Solde  FROM FGLEDG, FCHACC                              
      WHERE EGCONO = EACONO AND EGAIT1 = EAAITM AND EGCONO = 100 AND                 
      EGDIVI = PDIVI    and EAAITP=1 AND EADIVI ='   '                               
    GROUP BY EGYEA4, EGAIT1, EGAIT2, EGAIT3, EGAIT4, EGAIT5, EGAIT6, EGAIT7, EGVSER, 
       EAAICL HAVING SUM(EGACAM) <> 0;        
    END
    Voilà!

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    S'il faut conserver de façon perenne les données de la requête, alors créer une table est peut être la bonne solution, mais en ce cas pourquoi utiliser une procédure stockée pour quelque chose qui sera rarement utilisé (voire une seule fois) ?
    S'il s'agit au contraire de faire une sélection réutilisable sans sauvegarder les données, alors une vue est la bonne solution, ça évite la redondance de données et tous les risques associés...

    Par ailleurs
    • une requête formatée est beaucoup plus facile à lire et à maintenir qu'une requête écrite sur une seule ligne
    • les jointures s'écrivent depuis 1995 avec l'opérateur JOIN ce qui permet de distinguer ce qui ressort de la jointure de ce qui ressort de la restriction
    • des alias de tables et de colonnes sont recommandés pour faciliter la compréhension, ici, vos requêtes obligent le développeur à aller consulter la description de chaque table pour savoir de quelle table provient telle et telle colonne


    exemple d'ordre formaté et utilisant la norme SQL 1995 (mais sans alias de table ni de colonne ne pouvant pas deviner d'où proviennent les infos)
    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 TABLE QTEMP/CUMCPTGENE 
    AS(SELECT EGYEA4
            , EGAIT1
            , EGAIT2
            , EGAIT3
            , EGAIT4
            , EGAIT5
            , EGAIT6
            , EGAIT7
            , EGVSER
            , EAAICL
            , SUM(EGACAM) as Solde  
      from  FGLEDG
      inner join FCHACC                                
         on EGCONO = EACONO 
        and EGAIT1 = EAAITM 
      where EGCONO = 100 
        and EGDIVI = 'XXX'    
        and EAAITP=1 
        and EADIVI ='   '                                 
      GROUP BY EGYEA4
             , EGAIT1
             , EGAIT2
             , EGAIT3
             , EGAIT4
             , EGAIT5
             , EGAIT6
             , EGAIT7
             , EGVSER
             , EAAICL 
      HAVING SUM(EGACAM) <> 0
      ) 
    WITH DATA;

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

Discussions similaires

  1. Créer une procédure stockée sous MySQL avec phpmyadmin
    Par Jordan59 dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 17/08/2011, 14h08
  2. Impossible de créer une procédure stockée sur MySQL: 5.0.38
    Par donbrico dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 19/11/2008, 18h30
  3. créer une procédure stockée
    Par beet2che dans le forum VB.NET
    Réponses: 1
    Dernier message: 13/09/2008, 17h06
  4. problème pour créer une procédure stockée
    Par PoichOU dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 06/09/2007, 09h58
  5. Créer une procédure stockée depuis Delphi
    Par blonde dans le forum Bases de données
    Réponses: 10
    Dernier message: 10/03/2006, 11h26

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