针对这张表你写2个触发器呢? create or replace trigger tr_table before insert or update of tb_no on tablename .................. create or replace trigger tr_table2 after insert or update of tb_no on tablename...................
三个方案: 1. 修改触发器的逻辑,假设表B中的数据是根据表A中的数据求和得到的,那么在表A的触发器中对表B的记录进行差值计算即可。 2. 修改触发器的触发条件为AFTER UPDATE,并且没有FOR EACH ROW子句。 3. 修改业务层次逻辑,不要将该功能放在触发器中实现,而是放在前台或者通过存储过程来实现。
我写了一段代码,你可以试试 1、建测试表 create table TEST1 ( NAME VARCHAR2(20), CODE VARCHAR2(4), FULL VARCHAR2(50) ) tablespace test pctfree 10 initrans 1 maxtrans 255 storage ( initial 64 minextents 1 maxextents unlimited );
2、建package create or replace package pkg_test1 as type t_gno is table of test1.code%type index by binary_integer; v_gno t_gno; v_numbertries binary_integer := 0; end pkg_test1;
3、触发器1 create or replace trigger tr_test1_row before insert or update of code on test1 for each row begin pkg_test1.v_numbertries := pkg_test1.v_numbertries + 1; pkg_test1.v_gno(pkg_test1.v_numbertries) := :new.code; end tr_test1_row;
B中的数据是根据表A中的好几条数据计算出来的,也就意味着要使用更新后的表A的数据。
create or replace trigger tr_table
before insert or update of tb_no on tablename
..................
create or replace trigger tr_table2
after insert or update of tb_no on tablename...................
1. 修改触发器的逻辑,假设表B中的数据是根据表A中的数据求和得到的,那么在表A的触发器中对表B的记录进行差值计算即可。
2. 修改触发器的触发条件为AFTER UPDATE,并且没有FOR EACH ROW子句。
3. 修改业务层次逻辑,不要将该功能放在触发器中实现,而是放在前台或者通过存储过程来实现。
1、建测试表
create table TEST1
(
NAME VARCHAR2(20),
CODE VARCHAR2(4),
FULL VARCHAR2(50)
)
tablespace test
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
create or replace package pkg_test1 as
type t_gno is table of test1.code%type index by binary_integer;
v_gno t_gno;
v_numbertries binary_integer := 0;
end pkg_test1;
create or replace trigger tr_test1_row
before insert or update of code on test1
for each row
begin
pkg_test1.v_numbertries := pkg_test1.v_numbertries + 1;
pkg_test1.v_gno(pkg_test1.v_numbertries) := :new.code;
end tr_test1_row;
第一步是使用befor表级触发器,在这个触发器中将源表中数据数据存到临时表中
第二步是after行级触发器,在这里能够知道修改的表记录,所以先根据:old的记录将临时表记录删除,然后在将:new的记录插入到临时表中,这样便可以在临时表中得到与源表一样的数据,这样便可以达到与读取源表一样的效果了。
可能这样做的开销比较大,但目前使用这个方法还是能够达到读取数据的目的的。