Oracle - incremental synchronization of data _ cursor and merge into synchronization

Incremental Extraction

Just extract new or modified data. This method is better performance, but easy to miss.
Target table there, but the source table does not, can not be updated.
Take timestamp increments the data of the source table to delete powerless.

Source table by the update target table, the data source is usually first determined whether there is a table (determined by the primary key) in the destination table
, if present, then the data source table, update data of the target table.
If not, then insert the data directly from the source table to the target table.

------------------------------------- incremental data synchronization using cursors ------ -------------------------------

① create incremental data synchronization stored procedure

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;

② call a stored procedure

BEGIN
  SP_EMP_BACK2;
END ;

③ check target data in the table, according to whether the incremental synchronization logic is updated presence, absence, is inserted .

SELECT * FROM EMP_BACK1 ;

---------------------- use merge into ways to achieve incremental synchronization ------------------- ----------

① create incremental data synchronization stored procedure

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;

② call a stored procedure

BEGIN 
  SP_EMP_BACK3;
END ;

③ verify the results are correct

SELECT * FROM EMP_BACK1  ;
Published 31 original articles · won praise 3 · Views 7122

Guess you like

Origin blog.csdn.net/ferlylao/article/details/104092918