关于oracle触发器实现两个表按条件同步数据,大家帮帮忙......
A表和B表的表结构相同A(id,name,dept),表B(id,name,dept),name和dept作为主键,想要实现当向A表中进行数据的增删改操作时,B表同样进行...
A表和B表的表结构相同 A(id,name,dept) ,表B(id,name,dept),name和dept作为主键,想要实现当向A表中进行数据的增删改操作时,B表同样进行增删改操作,唯一要注意的是,当向A表中插入,修改或删除记录的dept字段以00XXX开头的情况下,B表同步的操作记录dept字段要插入01XXX 修改或删除01XXX的记录
现在如果不考虑dept 00改01的条件下同步数据已经实现,主要是怎么加入条件限制的功能
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
begin
if inserting then
insert into B(id,name,dept) values(:NEW.id,:NEW.name,:NEW.dept);
elsif updating then
update B set id=:NEW.id,name=:NEW.name,dept=:NEW.dept where name=:OLD.name and dept=:OLD.dept ;
elsif deleting then
delete from B where name=:OLD.name and dept=:OLD.dept ;
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end; 展开
现在如果不考虑dept 00改01的条件下同步数据已经实现,主要是怎么加入条件限制的功能
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
begin
if inserting then
insert into B(id,name,dept) values(:NEW.id,:NEW.name,:NEW.dept);
elsif updating then
update B set id=:NEW.id,name=:NEW.name,dept=:NEW.dept where name=:OLD.name and dept=:OLD.dept ;
elsif deleting then
delete from B where name=:OLD.name and dept=:OLD.dept ;
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end; 展开
2个回答
展开全部
比较常见的trigger错误,你这一句话因为有触发器所以要对同一个表改两次,
最好不要用trigger了,直接把处理写到程序里面更好,更容易控制,不容易产生不可预知的后果,或者性能问题。
具体语句的话,可以考虑使用pragma
autonomous_transaction,但是不建议。
最好不要用trigger了,直接把处理写到程序里面更好,更容易控制,不容易产生不可预知的后果,或者性能问题。
具体语句的话,可以考虑使用pragma
autonomous_transaction,但是不建议。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
vdept A.dept%TYPE;
begin
IF SUBSTR(:NEW.dept,1,2)='00' THEN
vdept:='01'+SUBSTR(:NEW.dept,3,3);
ELSE
--这个else是如果头两位不是'00'的情况;如果还有很多种情况,则这个ifelse要改成case语句了。
vdept:=:NEW.dept;
END IF;
if inserting then
insert into B(id,name,dept) values(:NEW.id,:NEW.name,vdept);
elsif updating then
update B set id=:NEW.id,name=:NEW.name,dept=:NEW.dept where name=:OLD.name and dept=vdept ;
elsif deleting then
delete from B where name=:OLD.name and dept=vdept ;
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
追问
谢谢,可是上面的写法只能实现插入新记录的需求,对于修改和删除操作对关联的表B是没有触发效果的,要怎么办呢
追答
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
vdept A.dept%TYPE;
begin
IF SUBSTR(:NEW.dept,1,2)='00' THEN
vdept:='01'+SUBSTR(:NEW.dept,3,3);
ELSE
--这个else是如果头两位不是'00'的情况;如果还有很多种情况,则这个ifelse要改成case语句了。
vdept:=:NEW.dept;
END IF;
if inserting then
insert into B(id,name,dept) values(:NEW.id,:NEW.name,vdept);
elsif updating then
update B set id=:NEW.id,name=:NEW.name,dept=vdept where name=:OLD.name and dept=vdept ;
elsif deleting then
delete from B where name=:OLD.name and dept=vdept ;
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询