问一个2个ORACLE数据库比较更新的问题

sj6071 2010-02-19 09:22:57
有2个ORACLE的数据库,分别在2台机器,其中一台(A机)有原始记录,有张收费表,每月收费记录不断增加,现在B机需要先吧A机器的数据拷贝下来分析(现实情况不允许直接访问A机),客户就需要做一个实时更新的功能(可能限制一些查询条件),现在问题是有的记录需要比较更新,以A机器为准
有这几种情况,
一种是记录已存在,A机器并且没改变,B不需要变化
一种是记录已存在,A机器记录发生改变,B机器需要把相应记录更新和A机器一致
记录是新的,B机器没有


怎么实现判断,并且根据情况更新B机器的数据?

我的想法是先根据条件查询出B机器所有符合条件的记录,全部删了,然后把A机器符合条件的记录全部插进来
就省去了一个一个比较了(A机器是原始数据,并且不断更新,B机器是A的拷贝),不知道大家是怎么处理这类问题的

刚用ORACLE10g,菜鸟一个,谢谢指点
...全文
207 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueskyWide 2010-02-20
  • 打赏
  • 举报
回复
如果仅只有一两张表的话,只需在B机中建一个JOB,如:


begin
sys.dbms_job.submit(job => :job,
what => 'TEST;',
next_date => to_date('21-02-2010', 'dd-mm-yyyy'),
interval => 'TRUNC(SYSDATE+1)');
commit;
end;
/


再做一个存贮过程来完成B机中的定时删除和重建此表工作,如:

CREATE OR REPLACE PROCEDURE TEST AS
begin

delete table_a@stringB;
INSERT INTO table_a@stringB select * from table_a@stringA;

commit;

end


当然B机中先要有table_a数据库等的结构,更新也可以在JOB中5分钟或按需更新。

sj6071 2010-02-20
  • 打赏
  • 举报
回复
数据库结构完全一致,只是在2台机器上,B机器的数据是A机器的拷贝
sj6071 2010-02-20
  • 打赏
  • 举报
回复
引用 7 楼 nbtoms 的回复:
个人觉得,在A机器的收费表上做个触发器,当A机器收费表发生变化时,通过触发器的一个dblink直接连接到B机器上就可以了。即:在触发器中根据不同的操作编写简单的代码对B机器相同表进行操作(考虑到效率问题也可以先插入到B机器的临时表中,然后在B机器的临时表上设置触发器更新B机器收费表)。我们目前的接口工作就是这样实现的。
前提:是A机器能访问并能修改B机器对应表数据。
A机器不允许随便访问的,至于数据库更不可能给你随便改动啊
宾子寻月人 2010-02-20
  • 打赏
  • 举报
回复
个人觉得,在A机器的收费表上做个触发器,当A机器收费表发生变化时,通过触发器的一个dblink直接连接到B机器上就可以了。即:在触发器中根据不同的操作编写简单的代码对B机器相同表进行操作(考虑到效率问题也可以先插入到B机器的临时表中,然后在B机器的临时表上设置触发器更新B机器收费表)。我们目前的接口工作就是这样实现的。
前提:是A机器能访问并能修改B机器对应表数据。
YY_MM_DD 2010-02-19
  • 打赏
  • 举报
回复
至于跨数据库的实现请参考。


ORACLE跨数据库查询
关键字: oracle跨数据库查询
本文简述了通过创建database link实现ORACLE跨数据库查询的方法

1.配置本地数据库服务器的tnsnames.ora文件

$vi $ORACLE_HOME/network/admin/tnsnames.ora

添加如下行,其中DBLINK为连接名(可自定义),HOST和PORT为数据库侦听的IP及端口,SERVICE_NAME为数据库的SID,

MEDIADBLINK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = db)
)
)

2.登录到本地数据库,创建database link

执行如下查询语句,其中MEDIADB为database link名(可自定义),MEDIADBLINK为先前在tnsnames.ora中定义的连接名,
dbuser为用户名,password为密码

-- Create database link
create database link MEDIADB
connect to dbuser identified by password
using 'MEDIADBLINK';

注意:这里不会验证用户名密码的正确性

3.使用链接的数据库

3.1 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@database link名”,如

select * from table_name@MEDIADB;

3.2 也可以为这个表创建一个同义词

create synonym aaa for table_name@MEDIADB;

如下语句的效果和3.1中的一样

select * from aaa;

删除同义词的语句为

drop synonym aaa;


YY_MM_DD 2010-02-19
  • 打赏
  • 举报
回复

--参考下这个句子吧。。。
merge into a using b on (a.USER_NO=b.USER_NO)
when matched then update set a.NAME=b.NAME
when not matched then insert values (b.USER_NO,b.NAME)
kingstarer 2010-02-19
  • 打赏
  • 举报
回复
AB表的表结构及相互之间的联系?

记录数不大可以用insert into ** where not exists **
记录数大就要根据具体情况分析
sj6071 2010-02-19
  • 打赏
  • 举报
回复
我要用编程实现的,用其他工具的方法可能不适合

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧