首页 新闻 会员 周边

Oracle 记录 受影响的记录数??

0
悬赏园豆:20 [已解决问题] 解决于 2009-11-13 20:43

有两个数据库,通过数据链进行连接操作,也就是同步更新相同表的数据。

数据库1:

表test(id,name)有两个字段

数据库2:

表test(id,name)有两个字段,同数据库1中的表test

表test_log(auto_id,update_count,update_date,op_type)是数据库2的日志表;

 

我是用数据库链接链有数据库1同步数据库2,就是更新数据库1的表test的时候也更新数据库2的表test,数据库1中是通过触发器或者Jobs方式去更新数据库2的表test的。

现在我想在数据库2的表test_log中记录每次由数据库1进行的增、删、改操作后,数据库2中的表test同步更新的记录数,要么增加的记录数要么修改或删除的记录数。

比如:对数据库2中的表test更新后,test_log会记录如下

       auto_id    update_count    update_date                          op_type

        1               10                     2009-11-11  08:00:00              增加

        2               2                       2009-11-11  08:22:00              修改

        3               1                       2009-11-11  08:24:00              删除

 

不知道用何种方式能够在数据库2中实现如上功能,请高手赐教。

我有试过用触发器,但sql%rowcount一直获取不到受影响的记录数。急!!!!!!!

waynelove的主页 waynelove | 初学一级 | 园豆:140
提问于:2009-11-11 20:55
< >
分享
最佳答案
0

行级trigger

for each row

里面个人认为无法获取到同一个表的行数.

可以考虑在存储过程中实现.

删除的时候用

SQL%ROWCOUNT来获取.

 

 

--2009 11-12  --21:11

 

 

 

Code
create table test1
(
id
varchar2(20),
name
varchar2(50)
)
insert into test1 values (1,'woody')
select * from test2
rollback
select * From test1
update test1 set name='asdas' where id='1'
select * from test_log
delete from test_log

CREATE OR REPLACE TRIGGER trg_test1_woody
after
INSERT OR DELETE OR UPDATE
ON test1
REFERENCING NEW
AS NEW OLD AS OLD
FOR EACH ROW
declare v_num number;
begin

if inserting then

insert into test2(id,name) values (:new.id,:new.name);
--获取数量
v_num:=sql%rowcount;
insert into test_log(auto_id,update_count,update_date,op_type) values
(test_log_seq.nextval,v_num,sysdate,
'inserting');
end if;
if updating then
--获取数量
update test2 set name=:new.name,id=:new.id where id=:old.id;
v_num:
=sql%rowcount;
insert into test_log(auto_id,update_count,update_date,op_type) values (test_log_seq.nextval,v_num,sysdate,'update');

end if;
if deleting then
--获取数量
delete from test2 where id=:old.id;
v_num:
=sql%rowcount;
insert into test_log(auto_id,update_count,update_date,op_type) values (test_log_seq.nextval,v_num,sysdate,'delete');

end if;
end trg_test1_woody;


create table test2
(
id
varchar2(20),
name
varchar2(50)
)
create sequence test_log_seq
create table test_log
(
auto_id
varchar2(20),
update_count
number,
update_date date,
op_type
varchar2(30)
)

 

收获园豆:20
woody.wu | 老鸟四级 |园豆:3621 | 2009-11-11 22:08
但是删除的话是在数据库1进行的 我要的是写在数据库2上的东西 触发器或存储过程, 既然说了 是存储过程 那么如何在数据库2中自动执行呢
waynelove | 园豆:140 (初学一级) | 2009-11-12 00:10
能不能帮忙做个例子 我忙活的半天还是 不行
waynelove | 园豆:140 (初学一级) | 2009-11-12 18:52
在看看.应该满足你的要求了。
woody.wu | 园豆:3621 (老鸟四级) | 2009-11-12 21:12
@woody.wu:先谢过,这样做我是有想到过,但问题在于表test1是在别人的服务器上的,所以我一直想要在自己的服务器的表test2上实现。如上方法只能部署在别人服务器上,才能记录到我的服务器上的表test_log。可能我表述的意思不够清楚吧。 有没有一种方式能够实现本机监视自己的表test2被别人服务器同步修改后的受影响的记录数呢?
waynelove | 园豆:140 (初学一级) | 2009-11-13 20:42
@CESC:考虑审记日志
woody.wu | 园豆:3621 (老鸟四级) | 2009-11-13 21:52
@woody.wu:或者建TEST3 table,然后给TEST2加TRRIGER
woody.wu | 园豆:3621 (老鸟四级) | 2009-11-14 16:34
@woody.wu:你上次做的只能获取一条受影响的数据啊 v_num一直都是1 if deleting then --获取数量 delete from test2 where id=:old.id; v_num:=sql%rowcount; insert into test_log(auto_id,update_count,update_date,op_type) values (test_log_seq.nextval,v_num,sysdate,'delete'); end if;
waynelove | 园豆:140 (初学一级) | 2009-11-17 23:39
其他回答(1)
0

我认为这和“受影响的记录数”没有直接关系。

1.数据库1表test添加触发器,分别在插入,更新,删除时同步数据库2表test,同时更新数据库2表test_log的统计

2.或者将上述1中的“更新数据库2表test_log的统计”放在数据库2的表test的插入,更新和删除触发器中。

莫慌 | 园豆:9 (初学一级) | 2009-11-12 00:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册