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

PL/SQL Oracle Discussion :

Insertion des données avec une procédure stockée et pb de ID clé primaire


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut Insertion des données avec une procédure stockée et pb de ID clé primaire
    Bonjour,
    J'ai une table temporaire qui stocke les données temporairament puis ils vont etre truncate :
    CREATE TABLE KPI.HTTP_ODS
    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
     
    (
      HOST            VARCHAR2(500 BYTE),
      DATE_HTTP       DATE,
      NBYTEDN         NUMBER,
      NBSESSTCP       NUMBER,
      AVG_SYN_SYNACK  NUMBER,
      AVG_SYNACK_ACK  NUMBER,
      DELAYREQANS     NUMBER,
      NBGET           NUMBER,
      NBPOST          NUMBER,
      OTHERREQ        NUMBER,
      NB1XX           NUMBER,
      NB2XX           NUMBER,
      NB3XX           NUMBER,
      NB4XX           NUMBER,
      NB5XX           NUMBER,
      NBOTHERANS      NUMBER
    )
    puis ma table que je vais l'utliser:

    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 TABLE KPI.HTTP_DWHS
    (
      ID              INTEGER                       PRIMARY KEY,
      HOST            VARCHAR2(500 BYTE),
      DATE_HTTP       DATE,
      NBYTEDN         NUMBER,
      NBSESSTCP       NUMBER,
      AVG_SYN_SYNACK  NUMBER,
      AVG_SYNACK_ACK  NUMBER,
      RTT_HTTP        NUMBER,
      DELAYREQANS     NUMBER,
      NBGET           NUMBER,
      NBPOST          NUMBER,
      OTHERREQ        NUMBER,
      NB1XX           NUMBER,
      NB2XX           NUMBER,
      NB3XX           NUMBER,
      NB4XX           NUMBER,
      NB5XX           NUMBER,
      NBOTHERANS      NUMBER
    )
    pour insérer les données de la table temporaire vers la table objecitf j'ai crée une procédure stockée en utilisant un curseur
    et du coup j'ai un erreur car la table ods ne contient pas la clé primaire je sais pas comment corriger cet erreur
    j'ai crée une séquence , j'essaye avec un trigger mais ça marche pas j'essaye avec seq.nextval j'ai le mem erreur
    ceci le code de 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
     
    CREATE OR REPLACE procedure KPI.http_modif is 
     
    CURSOR c_http is 
    select 
       HOST                        
      ,DATE_HTTP                
      ,NBYTEDN                  
      ,NBSESSTCP                
      ,kpi.unite_s(AVG_SYN_SYNACK)    
      ,kpi.unite_s(AVG_SYNACK_ACK)    
      ,kpi.sum_s(AVG_SYN_SYNACK, AVG_SYNACK_ACK) 
      ,kpi.unite_s(DELAYREQANS)    
      ,NBGET          
      ,NBPOST          
      ,OTHERREQ        
      ,NB1XX           
      ,NB2XX           
      ,NB3XX           
      ,NB4XX           
      ,NB5XX           
      ,NBOTHERANS      
    from kpi.http_ods;
     
    TYPE array_http is table of c_http%rowtype;
    http_data array_http;
     
    begin
     
     open c_http;
     
         loop 
              fetch c_http
              bulk collect into http_data
              limit 1000;
     
              begin 
                 forall i in 1..http_data.count
                 insert into KPI.HTTP_DWHS(HOST,DATE_HTTP,NBYTEDN,NBSESSTCP,AVG_SYN_SYNACK,AVG_SYNACK_ACK,RTT_HTTP
                                           ,DELAYREQANS,NBGET,NBPOST,OTHERREQ,NB1XX,NB2XX,NB3XX,NB4XX,NB5XX,NBOTHERANS) 
                 values http_data(i);
              end;
     
             exit when c_http%notfound;
         end loop;
     close c_http;
     
    end;
    /
    que je dois mettre pour ne pas avoir cet erreur et de générer le clé primaire automatiquement,

    merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Pour alimenter la PK, il faut une séquence qui sera appelée dans le select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select seq.nextval as id ...
    Après inutile de passer par une collection, faites juste un insert into select

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    merci pour ta réponse,

    je sais que je dois passer par seq.next
    mais le pb que mes données seront insérées dans la table temporaire avec un bulk insert à travers d'un job talend
    et data est volumineuse presque le fichier qui sera charger dans la table ods est environ 1GB

    donc l'idée pour charger dans la table dwhs est de crée cette procédure avec la collection ?
    comment faire pour la clé primaire ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ben avec la collection il suffit de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    .........
    CURSOR c_http IS 
    SELECT
       seq.nextval as id 
       HOST                        
      ,DATE_HTTP 
      ...
    ......  
      INSERT INTO KPI.HTTP_DWHS(id,HOST,DATE_HTTP,.....
    .......
    Non ?

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    Merci skuatamad
    comment il peut select une colonne qui n'existe pas dans la table ODS !!

    j'essaye d'éxécutre ce que tu me propose mais il me génére erreur nbre de valeurs insuffisants
    car le pauvre seq.nextval n'est pas sa propre colonne

    aidez moi svp
    merci d'avance

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Pouvez-vous poster le code modifié avec sequence ?
    La séquence n'est pas liée à une table.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE SEQUENCE id_seq_http_dwhs START WITH 1 INCREMENT BY 1;
    j'ai aussi penser à faire un trigger ceci le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER trigger_sequence_http_dwhs
    before INSERT ON kpi.http_dwhs FOR each row
    begin
       SELECT id_seq_http_dwhs.NEXTVAL INTO :new.id FROM dual;
    end;

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Le trigger va pourrir les perf, appelez la séquence dans le SELECT

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    ceci le code de 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
     
    CREATE OR REPLACE procedure KPI.http_modif is 
     
    CURSOR c_http is 
    select 
       id_seq_http_dwhs.NEXTVAL AS ID,
       HOST                        
      ,DATE_HTTP                
      ,NBYTEDN                  
      ,NBSESSTCP                
      ,kpi.unite_s(AVG_SYN_SYNACK)    
      ,kpi.unite_s(AVG_SYNACK_ACK)    
      ,kpi.sum_s(AVG_SYN_SYNACK, AVG_SYNACK_ACK) 
      ,kpi.unite_s(DELAYREQANS)    
      ,NBGET          
      ,NBPOST          
      ,OTHERREQ        
      ,NB1XX           
      ,NB2XX           
      ,NB3XX           
      ,NB4XX           
      ,NB5XX           
      ,NBOTHERANS      
    from kpi.http_ods;
     
    TYPE array_http is table of c_http%rowtype;
    http_data array_http;
     
    begin
     
     open c_http;
     
         loop 
              fetch c_http
              bulk collect into http_data
              limit 1000;
     
              begin 
                 forall i in 1..http_data.count
                 insert into KPI.HTTP_DWHS(ID,HOST,DATE_HTTP,NBYTEDN,NBSESSTCP,AVG_SYN_SYNACK,AVG_SYNACK_ACK,RTT_HTTP
                                           ,DELAYREQANS,NBGET,NBPOST,OTHERREQ,NB1XX,NB2XX,NB3XX,NB4XX,NB5XX,NBOTHERANS) 
                 values http_data(i);
              end;
     
             exit when c_http%notfound;
         end loop;
     close c_http;
     
    end;
    /
    et j'ai le mem erreur nbre insuffisant des paramétres

    comment je dois le faire ?

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Quelle est l'erreur exacte ? code plus texte en copier coller.

    Essayez avec des alias sur les colonnes calculées :
    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
    select 
    id_seq_http_dwhs.NEXTVAL AS ID,
       HOST                        
      ,DATE_HTTP                
      ,NBYTEDN                  
      ,NBSESSTCP                
      ,kpi.unite_s(AVG_SYN_SYNACK) as AVG_SYN_SYNACK
      ,kpi.unite_s(AVG_SYNACK_ACK) as AVG_SYNACK_ACK
      ,kpi.sum_s(AVG_SYN_SYNACK, AVG_SYNACK_ACK) as RTT_HTTP
      ,kpi.unite_s(DELAYREQANS) as DELAYREQANS
      ,NBGET          
      ,NBPOST          
      ,OTHERREQ        
      ,NB1XX           
      ,NB2XX           
      ,NB3XX           
      ,NB4XX           
      ,NB5XX           
      ,NBOTHERANS      
    .....

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    c'est lerreur :
    [Error] ORA-00947 (41: 14): PL/SQL: ORA-00947: nombre de valeurs insuffisant

    y'at-il une solution svp
    merci d'avance

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/09/2009, 13h46
  2. Réponses: 2
    Dernier message: 28/05/2006, 23h31
  3. [format des données avec une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 10/03/2005, 13h24
  4. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 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