我又简单的试了一下,(c表假设为邻时表)不行 SQL> create or replace trigger tr_demo 2 after insert on a 3 for each row 4 begin 5 insert into c values('demo',111,111); 6 end tr_demo; 7 /触发器已创建SQL> create or replace trigger tr_democ 2 after insert on c 3 for each row 4 begin 5 update a set bbb=222 where aaa='101'; 6 end tr_democ; 7 /触发器已创建SQL> insert into a values('bbb',1,1); insert into a values('bbb',1,1) * ERROR 位于第1行: ORA-04091: 表 TEMP.A 发生了变化,触发器/函数不能读 ORA-06512: 在"TEMP.TR_DEMOC", line 2 ORA-04088: 触发器 'TEMP.TR_DEMOC' 执行过程中出错 ORA-06512: 在"TEMP.TR_DEMO", line 2 ORA-04088: 触发器 'TEMP.TR_DEMO' 执行过程中出错 SQL>
触发器已经搞定了,在同一个表上建两个触发器, 一个是行触发器,一个是语句触发器,再建一个包, 包里的变量放数据用. 先用行触发器取得old or new 的值,然后马上传给包里的变量, 语句触发器从包里的变量获得值,再对原表操作. 有可能会出现ORA-00036错误,解决办法是设一个标志变量和异常处理,防止循环触发. 触发器的触发顺序是先行触发,紧跟着是语句触发.其他人还有什么好办法, 欢迎讨论.
SQL> create or replace trigger tr_demo
2 after insert on a
3 for each row
4 begin
5 insert into c values('demo',111,111);
6 end tr_demo;
7 /触发器已创建SQL> create or replace trigger tr_democ
2 after insert on c
3 for each row
4 begin
5 update a set bbb=222 where aaa='101';
6 end tr_democ;
7 /触发器已创建SQL> insert into a values('bbb',1,1);
insert into a values('bbb',1,1)
*
ERROR 位于第1行:
ORA-04091: 表 TEMP.A 发生了变化,触发器/函数不能读
ORA-06512: 在"TEMP.TR_DEMOC", line 2
ORA-04088: 触发器 'TEMP.TR_DEMOC' 执行过程中出错
ORA-06512: 在"TEMP.TR_DEMO", line 2
ORA-04088: 触发器 'TEMP.TR_DEMO' 执行过程中出错
SQL>
一个是行触发器,一个是语句触发器,再建一个包, 包里的变量放数据用.
先用行触发器取得old or new 的值,然后马上传给包里的变量,
语句触发器从包里的变量获得值,再对原表操作.
有可能会出现ORA-00036错误,解决办法是设一个标志变量和异常处理,防止循环触发.
触发器的触发顺序是先行触发,紧跟着是语句触发.其他人还有什么好办法,
欢迎讨论.