暂无图片
oracle如何使用触发器将A表的指定字段同步到B表
我来答
分享
弱小可怜又无助
2021-12-20
oracle如何使用触发器将A表的指定字段同步到B表
暂无图片 25M

数据库版本:Oracle 11.2.0.4.0

需求:emp_a表的updatetime时间有变化的时候,将这个时间同步更新至emp_b表


emp_a和emp_b表没有关联条件


EMP_A表数据如下:


测试数据

create table emp_a
(empno number,
ename varchar2(20),
updatetime date);
insert into emp_a values(1,'scott',SYSDATE);
insert into emp_a values(2,'SMITH',SYSDATE);
insert into emp_a values(3,'KING',SYSDATE);
select * from emp_a


EMP_B表数据如下:


create table emp_b
(empno number,
ename varchar2(20),
updatetime date);
insert into emp_b values(1,'scott',SYSDATE);
insert into emp_b values(2,'SMITH',SYSDATE);
insert into emp_b values(3,'KING',SYSDATE);
select * from emp_b



听说触发器可以实现,但是不会使用触发器

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
DarkAthena
create or replace trigger after update on EMP_A for each row declare begin if :old.updatetime <> :new.updatetime then update EMP_b b set b.updatetime = :new.updatetime where b.empno = :new.empno; end if; end; /

需求不够完整,根据问题描述只能这么写,需要注意几个问题

  1. 要根据什么条件来更新数据?我这个例子是假定根据empno这个字段相等的
  2. 如果EMP_A表存在插入或者删除,是否要对EMP_b表进行同步操作?这个例子中只对update进行操作,不含insert和delete
  3. updatetime是否存在空值?把空值更新成非空,此例也不会进行处理,除非修改判断条件nvl(:old.updatetime,date’1900-01-01’) <> nvl(:new.updatetime,date’1900-01-01’)

另外,你这个例子中两个表结构是完全一致的,目的是什么?说清楚背景,或许有更好的解决方案

暂无图片 评论
暂无图片 有用 0
暂无图片
弱小可怜又无助
题主
2021-12-22
谢谢,表结构不一样,只是测试数据
薛晓刚

两个表一模一样,为什么要用触发器?就用一个表不行吗?

如果触发器用不好,可能其他手段也有难度。

暂无图片 评论
暂无图片 有用 0
Thomas

create or replace trigger after insert or update or delete on EMP_A for each row

as

begin 

if updating then

if :old.updatetime <> :new.updatetime then 

update EMP_b b set b.updatetime = :new.updatetime where b.empno = :new.empno; 

end if;

end if;

if deleting then

delete from emp_b where empno=:old.empno;

end if;

if inserting then

insert into emp_b values (:new.empno,:new.empname,:new.updatetime);

end if;

end;

/

暂无图片 评论
暂无图片 有用 0
弱小可怜又无助
题主
2021-12-22
谢谢
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏