在我的应用程序中,用户可以更新一些数据。我想在AG_TABLE_UPDATE_HISTORY表中保存所有更新的列及其值。表格的结构如下:
CREATE TABLE "AG_TABLE_UPDATE_HISTORY"
(
"TABLE_NAME" VARCHAR2(20 BYTE),
"ROW_ID" VARCHAR2(20 BYTE),
"COLUMN_NAME" VARCHAR2(20 BYTE),
"PREVIOUS_VALUE" VARCHAR2(20 BYTE),
"CURRENT_VALUE" VARCHAR2(20 BYTE)
)
我知道,我可以通过在:old
中逐个比较:new
和BEFORE UPDATE trigger
列来获取更新列的名称。
但是,我想知道Oracle有没有更好的方式提供给我们?
答案 0 :(得分:1)
答案取决于您希望仅保留UPDATE语句中更改的值,或者您希望跟踪已更新的列的事实。 Oracle建议UPDATING()函数在触发器中起作用,这可能会有所帮助:
SQL> create table t (x int, y varchar2(10), z date)
2 /
SQL> insert into t values(1,'A',sysdate)
2 /
SQL> create or replace trigger tr_t
2 before update on t
3 for each row
4 begin
5 if updating('X') then
6 dbms_output.put_line('Old X is '||:old.X);
7 dbms_output.put_line('New X is '||:new.X);
8 end if;
9 if updating('Y') then
10 dbms_output.put_line('Old Y is '||:old.Y);
11 dbms_output.put_line('New Y is '||:new.Y);
12 end if;
13 if updating('Z') then
14 dbms_output.put_line('Old Z is '||:old.Z);
15 dbms_output.put_line('New Z is '||:new.Z);
16 end if;
17 end;
18 /
SQL> set serveroutput on
SQL> update t set x = 2;
Old X is 1
New X is 2
1 row updated.
SQL> update t set x = 1, y='C';
Old X is 2
New X is 1
Old Y is A
New Y is C
1 row updated.
SQL> update t set x = 1, y='C', z = sysdate+1;
Old X is 1
New X is 1
Old Y is C
New Y is C
Old Z is 14.04.14
New Z is 15.04.14
1 row updated.