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 :

Trigger + copier tous les champs


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 37
    Par défaut Trigger + copier tous les champs
    Bonjour,

    Je dois générer une table d'historique, qui à chaque update, devra conserver l'intégralité des données dans leur état, avant mise à jour.
    J'aimerais savoir s'il était possible de faire un ordre du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into toto_histo (select * from old);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into toto_hisot(select "old" from dual)"old" représenterait la ligne de la table toto.
    En fait, ma table toto contien 219 colonnes, donc si je pouvais éviter de faire un insert avec (xxxx, yyyy, ....) values (:old.xxxx, :old.yyyy, ...) 219 fois, ce serait sympa.

    Je suis ouvert à toutes les propositions.

    D'avance merci.

    Cdt,

    Alex.

  2. #2
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Sql dynamique (dbms_sql)
    ou execute imediate + vue SYS.COL

  3. #3
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Citation Envoyé par allex2108
    Bonjour,

    Je dois générer une table d'historique, qui à chaque update, devra conserver l'intégralité des données dans leur état, avant mise à jour.
    J'aimerais savoir s'il était possible de faire un ordre du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into toto_histo (select * from old);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into toto_hisot(select "old" from dual)"old" représenterait la ligne de la table toto.
    En fait, ma table toto contien 219 colonnes, donc si je pouvais éviter de faire un insert avec (xxxx, yyyy, ....) values (:old.xxxx, :old.yyyy, ...) 219 fois, ce serait sympa.

    Je suis ouvert à toutes les propositions.

    D'avance merci.

    Cdt,

    Alex.
    si vous commenciez par nous dire si vous avez testé (et si oui quel code exact) votre idée ?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Vous pouvez essayer d'adapter le code suivant qui consiste à générer dans une variable PL/SQL le code source PL/SQL pour l'instruction 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
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    SQL> set serveroutput on
    SQL> drop table t
    Table dropped.
    SQL> create table t(c1 int, c2 int, c3 int)
    Table created.
    SQL> --
    SQL> -- generates the INSERT statement for the UPDATE trigger
    SQL> -- in a existing VARCHAR2 variable (contents of p_stmt is _not_  erased)
    SQL> -- with enclosing BEGIN/END 
    SQL> CREATE OR REPLACE PROCEDURE gen_insert(p_table_name IN VARCHAR2, p_stmt IN OUT VARCHAR2 ) IS
    v_first_column BOOLEAN := TRUE;
    v_char CHAR := CHR(0);
    v_pattern1 CHAR(3) := ',' || CHR(10) ||  v_char;
    v_pattern2 CHAR(2) := CHR(10);
    v_table_name VARCHAR2(30) := UPPER(p_table_name);
    BEGIN
    p_stmt := p_stmt || 'BEGIN' || CHR(10);
    p_stmt := p_stmt || 'INSERT INTO ' || LOWER(p_table_name) || '_audit' ||  ' ( ' || CHR(10);
    -- list of columns names 
    FOR v_cols IN (SELECT column_name FROM user_tab_cols WHERE table_name = v_table_name)
    LOOP
      p_stmt := p_stmt ||  LOWER(v_cols.column_name) || ',' ||  CHR(10);
    END LOOP;
    -- remove last comma
    p_stmt := p_stmt || v_char;
    p_stmt := REPLACE(p_stmt, v_pattern1, v_pattern2);
    p_stmt := p_stmt || ' )' || CHR(10) ||  ' VALUES ( ' || CHR(10);
    v_first_column:= TRUE;
    -- list of columns with ':old' prefix
    FOR v_cols IN (SELECT column_name FROM user_tab_cols WHERE table_name = v_table_name)
    LOOP
      p_stmt := p_stmt ||  ':old.' ||  LOWER(v_cols.column_name) || ',' ||  CHR(10);
    END LOOP;
    -- remove last comma
    p_stmt := p_stmt || v_char;
    p_stmt := REPLACE(p_stmt, v_pattern1, v_pattern2);
    p_stmt := p_stmt ||  ' ); ' || CHR(10);
    p_stmt := p_stmt || 'END;' || CHR(10);
    END;
    Procedure created.
    SQL> show errors
    No errors.
    SQL> declare code varchar2(200);
    begin
    gen_insert('T', code);
    dbms_output.put_line(code);
    end;
    BEGIN
    INSERT INTO t_audit ( 
    c1,
    c2,
    c3
      )
     VALUES ( 
    :old.c1,
    :old.c2,
    :old.c3
      ); 
    END;
    PL/SQL procedure successfully completed.
    SQL> show errors
    No errors.

Discussions similaires

  1. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26
  2. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 10h31
  3. selectionner tous les champs sauf un ?
    Par HULK dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/01/2005, 15h51
  4. Retrouver tous les champs d'une table
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2004, 20h40
  5. Afficher tous les champs d'une table avec dbexpress et MySQL
    Par LHT dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2004, 17h11

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