首先创建表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为主键,同时更新两列或更多列的时候,更新的列不会写在一起,而是分两条记录来写的,问,如何才能写在一条记录里面?
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为主键,同时更新两列或更多列的时候,更新的列不会写在一起,而是分两条记录来写的,问,如何才能写在一条记录里面?
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
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;
警告: 创建的触发器带有编译错误。不知道哪里有问题,麻烦能帮忙检查一下吗?
·
·
·
IF updating('col2')
·
·
·
IF updating('col3')
·
·
·
这样如果只更新一个字段没有错,如果更新几个字段就不行了 。请问有改进的方法吗?
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;