现有表A,在此表上建立一个触发器,触发器的作用是在A表中记录发生变化后,读取表A的记录,在网上找资料说如果更新后,直接读的话属于脏读,有想过先将表中数据存到另一张临时表中,但是如果更新的话,临时表还是会出现同样的情况,所以求助各位大虾们有什么好的方法!
解决方案 »
- oracle sql动态执行问题(动态表名)
- 问一个小白问题
- ALL和IN是不是意思一样啊?
- 安装oracle92010时,出现加载数据库时出错 areasQueries
- oracle 的一个视图能对其进行update操作或delete,insert操作吗?
- 我这句ORACLE SQL语句错在哪?
- 谁能告诉我,clob类型的字段如何存取?谢谢了?
- 用SQL语句查询数据库中的表(即列出有多少表),如何操作,急
- 存储过程
- 自学Java,学习到数据库,发现oracle sql delover连接不上服务器
- oracle删除约束
- 在线等~两个oracle库 不同表空间,一表和另一个视图数据的同步怎么实现??
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的记录插入到临时表中,这样便可以在临时表中得到与源表一样的数据,这样便可以达到与读取源表一样的效果了。
可能这样做的开销比较大,但目前使用这个方法还是能够达到读取数据的目的的。