首先创建表A和表B
create table A( 
   col1 varchar2(10),
   col2 varchar2(50),
   col3 varchar2(10));create table B(      
tablename varchar2(10),   
primarykey varchar2(255),   
rowkey varchar2(255),   
operation varchar2(10));  之后创建oracle  update触发器
create or replace trigger cdcTriUpdate
  after update on a  
  for each row
declare
  -- local variables here
begin
IF updating('col1') 
THEN      
INSERT INTO b      
(tablename,primarykey,rowkey,operation)     
VALUES      
('A','A.col1='||:new.col1 ,'1','update');
END IF;
IF updating('col2') 
THEN      
INSERT INTO b      
(tablename,primarykey,rowkey,operation)     
VALUES      
('A','A.col2='||:new.col2 ,'2','update');
END IF;
IF updating('col3') 
THEN      
INSERT INTO b      
(tablename,primarykey,rowkey,operation)     
VALUES      
('A','A.col3='||:new.col3 ,'3','update');
END IF;
end cdcTriUpdate; 功能是当对表A进行update,立刻触发写入表B中,得到(表名,update的值,列,操作类型)但是当以col1为主键,同时更新两列或更多列的时候,更新的列不会写在一起,而是分两条记录来写的,问,如何才能写在一条记录里面?

解决方案 »

  1.   

    如果我 update A set col2=AAA,col3=BBB where col1=1得到的结果是这样
    tablename(表名) primarykey(更新值) rowkey(列) operation(操作类型) 
    A                A.COL2=AAA              2           UPDATE
    A                A.COL3=BBB              3           UPDATE想得到这样的结果
    tablename(表名) primarykey(更新值)     rowkey(列) operation(操作类型) 
    A                A.COL2=AAA,A.COL3=BBB      2,3           UPDATE
      

  2.   

    create or replace trigger cdcTriUpdate
      after update on a  
      for each row
    declare
      str1 varchar2 :='';
      str2 varchar2 :='';
    begin
    IF updating('col1') 
    THEN      
    str1:=str1||'A.col1='||:new.col1;
    str2:=str1||'1';
    END IF;IF updating('col2') 
    THEN      
    str1:=str1||','||'A.col2='||:new.col2;
    str2:=str1||',2';        
    END IF;IF updating('col3') 
    THEN 
    str1:=str1||','||'A.col3='||:new.col3;
    str2:=str1||',3';
    END IF;     
    INSERT INTO b      
    (tablename,primarykey,rowkey,operation)     
    VALUES      
    ('A',ltrim(str1,','),ltrim(str2,','),'update');end cdcTriUpdate;
      

  3.   

    谢谢楼上的帮助,运行这个触发器 SQL 语句的时候报错···
    警告: 创建的触发器带有编译错误。不知道哪里有问题,麻烦能帮忙检查一下吗?
      

  4.   

    IF updating('col1') 
    ·
    ·
    ·
    IF updating('col2') 
    ·
    ·
    ·
    IF updating('col3') 
    ·
    ·
    ·
    这样如果只更新一个字段没有错,如果更新几个字段就不行了 。请问有改进的方法吗?
      

  5.   

    用:NEW.COL1<>:OLD.COL1来判断吧,相应的地方都改了.
      

  6.   

    create or replace trigger cdcTriUpdate
      after update on a
      for each row
    declare
      str1  b.primarykey%type :='';
      str2  b.rowkey%type :='';
    begin
    IF :new.col1 != :old.col1
    THEN
    str1:=str1||'A.col1='||:new.col1;
    str2:=str2||'1';
    END IF;IF  :new.COL2 != :old.COL2 THEN
    str1:=str1||','||'A.col2='||:new.col2;
    str2:=str2||',2';
    END IF;IF  :new.COL3 != :OLD.COL3
    THEN
    str1:=str1||','||'A.col3='||:new.col3;
    str2:=str2||',3';
    END IF;
    INSERT INTO b
    (tablename,primarykey,rowkey,operation)
    VALUES
    ('A',ltrim(str1,','),ltrim(str2,','),'update');end cdcTriUpdate;