有2个ORACLE的数据库,分别在2台机器,其中一台(A机)有原始记录,有张收费表,每月收费记录不断增加,现在B机需要先吧A机器的数据拷贝下来分析(现实情况不允许直接访问A机),客户就需要做一个实时更新的功能(可能限制一些查询条件),现在问题是有的记录需要比较更新,以A机器为准
有这几种情况,
一种是记录已存在,A机器并且没改变,B不需要变化
一种是记录已存在,A机器记录发生改变,B机器需要把相应记录更新和A机器一致
记录是新的,B机器没有
怎么实现判断,并且根据情况更新B机器的数据?我的想法是先根据条件查询出B机器所有符合条件的记录,全部删了,然后把A机器符合条件的记录全部插进来
就省去了一个一个比较了(A机器是原始数据,并且不断更新,B机器是A的拷贝),不知道大家是怎么处理这类问题的刚用ORACLE10g,菜鸟一个,谢谢指点
有这几种情况,
一种是记录已存在,A机器并且没改变,B不需要变化
一种是记录已存在,A机器记录发生改变,B机器需要把相应记录更新和A机器一致
记录是新的,B机器没有
怎么实现判断,并且根据情况更新B机器的数据?我的想法是先根据条件查询出B机器所有符合条件的记录,全部删了,然后把A机器符合条件的记录全部插进来
就省去了一个一个比较了(A机器是原始数据,并且不断更新,B机器是A的拷贝),不知道大家是怎么处理这类问题的刚用ORACLE10g,菜鸟一个,谢谢指点
记录数大就要根据具体情况分析
--参考下这个句子吧
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)
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;
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
begindelete table_a@stringB;
INSERT INTO table_a@stringB select * from table_a@stringA;commit;
end
当然B机中先要有table_a数据库等的结构,更新也可以在JOB中5分钟或按需更新。
前提:是A机器能访问并能修改B机器对应表数据。