オラクル - データの増分同期_同期にカーソルとマージ

インクリメンタル抽出

ただ、新規または変更されたデータを抽出します。この方法は、より優れたパフォーマンスが、ミスに簡単です。
そこにターゲット表が、ソース表には、更新することはできませんしません。
削除無力にタイムスタンプの増分にソーステーブルのデータを取ります。

ソース更新対象テーブルによりテーブル、データ・ソースは、通常、最初のテーブルは、宛先表に(主キーによって決定される)が存在するか否かを判定する
存在する場合、そのデータ・ソース表、ターゲットテーブルの更新データ。
そうでない場合には、ターゲット表にソース・テーブルから直接データを挿入します。

カーソルを使用して-------------------------------------増分データ同期------ -------------------------------

①増分データ同期のストアドプロシージャを作成します

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 ;

----------------------増分同期を達成するための方法に使用マージ------------------- ----------

①増分データ同期のストアドプロシージャを作成します

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