增量同步Oracle数据库,游标和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  ;

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

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值