有2个ORACLE的数据库,分别在2台机器,其中一台(A机)有原始记录,有张收费表,每月收费记录不断增加,现在B机需要先吧A机器的数据拷贝下来分析(现实情况不允许直接访问A机),客户就需要做一个实时更新的功能(可能限制一些查询条件),现在问题是有的记录需要比较更新,以A机器为准
有这几种情况,
一种是记录已存在,A机器并且没改变,B不需要变化
一种是记录已存在,A机器记录发生改变,B机器需要把相应记录更新和A机器一致
记录是新的,B机器没有
怎么实现判断,并且根据情况更新B机器的数据?我的想法是先根据条件查询出B机器所有符合条件的记录,全部删了,然后把A机器符合条件的记录全部插进来
就省去了一个一个比较了(A机器是原始数据,并且不断更新,B机器是A的拷贝),不知道大家是怎么处理这类问题的刚用ORACLE10g,菜鸟一个,谢谢指点

解决方案 »

  1.   

    AB表的表结构及相互之间的联系?记录数不大可以用insert into ** where not exists **
    记录数大就要根据具体情况分析
      

  2.   


    --参考下这个句子吧
    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)
      

  3.   

    至于跨数据库的实现请参考。
    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;
      

  4.   

    如果仅只有一两张表的话,只需在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
    begindelete table_a@stringB;
    INSERT INTO table_a@stringB select * from table_a@stringA;commit;
     
    end
    当然B机中先要有table_a数据库等的结构,更新也可以在JOB中5分钟或按需更新。
      

  5.   

    个人觉得,在A机器的收费表上做个触发器,当A机器收费表发生变化时,通过触发器的一个dblink直接连接到B机器上就可以了。即:在触发器中根据不同的操作编写简单的代码对B机器相同表进行操作(考虑到效率问题也可以先插入到B机器的临时表中,然后在B机器的临时表上设置触发器更新B机器收费表)。我们目前的接口工作就是这样实现的。
    前提:是A机器能访问并能修改B机器对应表数据。