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  ;
发布了31 篇原创文章 · 获赞 3 · 访问量 7122

猜你喜欢

转载自blog.csdn.net/ferlylao/article/details/104092918