我最近做过,两个数据库里面的同步,和你的要求差不多,不过肯定得比较,不然怎么update是不,做的时候先判断insert 再update 再delete ,具体实现可以监听器,可以job,然后结合存储过程,其实比较简单
下面是监听器加存储过程
/****插入信息***/
create or replace trigger INSERTUSER_FROM_ZD_T0_OA
  after insert on sys_com_yhxx  
  for each row
declare
  -- local variables here
  V_USERNAME VARCHAR2(50 CHAR);--YHMC
  V_DEPT VARCHAR2(64);--DWBM
  V_FIRST_NAME VARCHAR2(50 CHAR);--YHSM
  V_TEMP NUMBER(10);--中间变量赋值给部门ID
  V_TEMP2 VARCHAR2(64);--查询中地部门中文名
  V_ID NUMBER(19);--插入OA中的ID
begin
  V_USERNAME := :new.YHMC;--取中地的登录用户名
  V_DEPT := :new.DWBM;--取中地的单位编码
  V_FIRST_NAME := :new.YHSM;--取中地的用户姓名
  
  select oa_oracl.nextval into V_ID from dual ;--获取OA中的全局ID
  select DDWM into V_TEMP2 from SYS_COM_ZZJG where DWBM = V_DEPT;--查询中地部门中文名 然后把中文跟OA对比,来查OA中的部门编码
  select id into V_TEMP from SYS_DEPT@SY_OA.REGRESS.RDBMS.DEV.US.ORACLE.COM  where DWMC =V_TEMP2 and rownum =1;  
  insert into APP_USER@SY_OA.REGRESS.RDBMS.DEV.US.ORACLE.COM(ID,ACCOUNT_EXPIRED,ACCOUNT_LOCKED,CREDENTIALS_EXPIRED,ACCOUNT_ENABLED,FIRST_NAME,PASSWORD,USERNAME,VERSION,DEPT) values(V_ID,0,0,0,1,V_FIRST_NAME,'40bd001563085fc35165329ea1ff5c5ecbdbbeef',V_USERNAME,0,V_TEMP);
end INSERTUSER_FROM_ZD_T0_OA;/****更新信息***/
create or replace trigger UPDATEUSER_FROM_ZD_TO_OA
  after update on sys_com_yhxx  
  for each row
declare
  -- local variables here
  V_USERNAME VARCHAR2(50 CHAR);--YHMC
  V_DEPT VARCHAR2(64);--DWBM
  V_FIRST_NAME VARCHAR2(50 CHAR);--YHSM
  
  V_TEMP NUMBER(10);--中间变量赋值给部门ID
  V_TEMP2 VARCHAR2(64);--查询中地部门中文名begin
  V_USERNAME := :new.YHMC;--取中地的登录用户名
  V_DEPT := :new.DWBM;--取中地的单位编码
  V_FIRST_NAME := :new.YHSM;--取中地的用户姓名
  
  select DDWM into V_TEMP2 from SYS_COM_ZZJG where DWBM = V_DEPT;--查询中地部门中文名 然后把中文跟OA对比,来查OA中的部门编码
  select id into V_TEMP from SYS_DEPT@SY_OA.REGRESS.RDBMS.DEV.US.ORACLE.COM  where DWMC =V_TEMP2 and rownum =1;
  update APP_USER@SY_OA.REGRESS.RDBMS.DEV.US.ORACLE.COM set FIRST_NAME =V_FIRST_NAME ,DEPT = V_TEMP WHERE USERNAME = V_USERNAME;
end UPDATEUSER_FROM_ZD_TO_OA;/****删除信息***/
create or replace trigger DELETEUSER_FROM_ZD_TO_OA
  after delete on sys_com_yhxx  
  for each row
declare
  -- local variables here
   V_USERNAME VARCHAR2(50 CHAR);--YHMC
begin
  V_USERNAME := :new.YHMC;--取中地的登录用户名
  delete from APP_USER@SY_OA.REGRESS.RDBMS.DEV.US.ORACLE.COM  WHERE USERNAME = V_USERNAME;
如果需要JOB的,代码在用户服务器上面,改天可以给你,也非常简单,不过三步写在一个存储过程中,然后JOB调用

解决方案 »

  1.   

    MERGE INTO TB   
        USING TA   
         ON (TA.A = TB.a)   
         WHEN NOT MATCHED THEN  
         INSERT  
         VALUES (TA.A, TA.B, TA.C);MERGE INTO TB   
         USING TA   
         ON (TA.A = TB.a)   
         WHEN MATCHED THEN  
         UPDATE  
         SET TB.b = TA.B,   
         TB.c = TA.C;DELETE FROM TB WHERE a NOT IN (SELECT A FROM TA)
      

  2.   

    不比较的话,那就直接更新,无论是否改动,比如:a表的a字段,直接更新 b表的a字段,其他的不动。每天把a表变化的所有记录,把b表对应的所有字段更新一遍。这个方法小数据量还可以,大量的话,有点说不过去了。实现也很简单,写个过程,循环下你a表变化的记录,然后就开始update b表,job调用触发下。
      

  3.   

    不比较怎么知道修改过?
    要么就用楼上几位的方法,insert,update,delete都执行一次
    要么额外保存A表的变化情况(直接存成sql),再来修改B表
      

  4.   

    OLTP还是OLAP?
    在OLAP里面使用触发器来同步数据,尤其是大量数据,会使DB瘫痪。
    OLTP里面可以尝试。
      

  5.   

    确实看完帖子 就想用merge into