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

  1. #1
    Membre du Club
    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
    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
    Expert éminent sénior
    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;