我最近做过,两个数据库里面的同步,和你的要求差不多,不过肯定得比较,不然怎么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调用
下面是监听器加存储过程
/****插入信息***/
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调用
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)
要么就用楼上几位的方法,insert,update,delete都执行一次
要么额外保存A表的变化情况(直接存成sql),再来修改B表
在OLAP里面使用触发器来同步数据,尤其是大量数据,会使DB瘫痪。
OLTP里面可以尝试。