Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/07/2007, 17h24   #1
Invité régulier
 
Inscription : avril 2005
Messages : 37
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 37
Points : 7
Points : 7
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 :
INSERT INTO toto_histo (SELECT * FROM old);
ou
Code :
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.
allex2108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 17h27   #2
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Sql dynamique (dbms_sql)
ou execute imediate + vue SYS.COL
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 18h32   #3
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 :
INSERT INTO toto_histo (SELECT * FROM old);
ou
Code :
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 ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2007, 09h10   #4
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
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 :
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.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web