1. 程式人生 > 資料庫 >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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
②呼叫儲存過程

BEGIN
  SP_EMP_BACK2;
END ;
1
2
3
③檢查目標表中的資料,是否按照增量同步的邏輯,存在則更新,不存在,則插入。

SELECT * FROM EMP_BACK1 ;
1
---------------------- 使用 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