增量同步Oracle数据库,游标和merge into 方式

it2023-04-04  65

这里写自定义目录标题

增量同步Oracle数据库,游标和merge into 方式使用游标进行增量数据同步使用 merge into 的方式实现增量同步

增量同步Oracle数据库,游标和merge into 方式

增量抽取 只需抽取新增的或修改的数据。此方法性能好,但容易遗漏。 目标表中有,但是源表中没有的话,更新不了。 以时间戳取增量,对源表删除的数据无能为力。

通过源表更新目标表的时候,通常是先判断 源表中的数据在目标表中是否存在(通过主键判断) 如果存在,那么就用源表的数据,更新目标表的数据。 如果不存在,那么就直接从源表中插入数据到目标表。

使用游标进行增量数据同步

①创建增量数据同步存储过程

CREATE OR REPLACE PROCEDURE SP_EMP_BACK2 IS CURSOR C_EMP IS --声明游标指向结果集 SELECT * FROM EMP; V_EMP C_EMP%ROWTYPE; V_CT NUMBER(5); V_MARK NUMBER(5); BEGIN --初始化变量 V_MARK := SEQ_TEST2.NEXTVAL;--序列值 FOR V_EMP IN C_EMP LOOP SELECT COUNT(1) INTO V_CT FROM EMP_BACK1 -- 比较字段,通过主键 empno 判断员工信息是否存在于目标表 WHERE EMPNO = V_EMP.EMPNO; -- 判断源表中的数据在目标表中存在,存在则用源表中的数据更新目标表 IF V_CT = 1 THEN UPDATE EMP_BACK1 M SET -- 这里更新的时候,不能更新 比较字段。 M.ENAME = V_EMP.ENAME, M.JOB = V_EMP.JOB, M.MGR = V_EMP.MGR, M.HIREDATE = V_EMP.HIREDATE, M.SAL = V_EMP.SAL, M.COMM = V_EMP.COMM, M.DEPTNO = V_EMP.DEPTNO, M.DATA_DATE = SYSDATE, M.MARK = V_MARK WHERE EMPNO = V_EMP.EMPNO; -- 判断源表中的数据,在目标表中不存在,那么就插入数据 ELSIF V_CT = 0 THEN INSERT INTO EMP_BACK1 (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DATA_DATE, MARK) VALUES (V_EMP.EMPNO, V_EMP.ENAME, V_EMP.JOB, V_EMP.MGR, V_EMP.HIREDATE, V_EMP.SAL, V_EMP.COMM, V_EMP.DEPTNO, SYSDATE, V_MARK); END IF; END LOOP; COMMIT; END;

②调用存储过程

BEGIN SP_EMP_BACK2; END ;

③检查目标表中的数据,是否按照增量同步的逻辑,存在则更新,不存在,则插入。

SELECT * FROM EMP_BACK1 ;

使用 merge into 的方式实现增量同步

①创建增量数据同步存储过程

CREATE OR REPLACE PROCEDURE SP_EMP_BACK3 IS V_MARK NUMBER(5); BEGIN V_MARK := SEQ_TEST2.NEXTVAL; MERGE INTO EMP_BACK1 M -- 使用 merge into 更新目标表 EMP_BACK1 USING (SELECT * FROM EMP) E -- 使用 () 内的查询结果 ON (M.EMPNO = E.EMPNO) -- 通过 on 后面的条件比较 -- 判断源表中数据在目标表中存在,则更新 WHEN MATCHED THEN -- 当 on 后面的条件比较 匹配上数据,then 更新 UPDATE SET -- 比较字段 empno 不能更新 M.ENAME = E.ENAME, M.JOB = E.JOB, M.MGR = E.MGR, M.HIREDATE = E.HIREDATE, M.SAL = E.SAL, M.COMM = E.COMM, M.DEPTNO = E.DEPTNO, M.DATA_DATE = SYSDATE, M.MARK = V_MARK -- 这里不加分号 ,分号表示程序执行到这里结束 -- 判断源表中的数据在目标表不存在,则插入 WHEN NOT MATCHED THEN -- 当 on 后面的条件比较 匹配不到数据,then 插入 INSERT (M.EMPNO, M.ENAME, M.JOB, M.MGR, M.HIREDATE, M.SAL, M.COMM, M.DEPTNO, M.DATA_DATE, M.MARK) VALUES (E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO, SYSDATE, V_MARK); COMMIT; END;

②调用存储过程

BEGIN SP_EMP_BACK3; END ;

③ 验证结果是否正确

SELECT * FROM EMP_BACK1 ;

版权声明:本文为博主「ferlylao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ferlylao/article/details/104092918

最新回复(0)