-- 数据同步

 1 全量数据同步 

   1.1 不带参数的实现方式

      每次更新目标表的时候,先把目标表中的数据清空,然后用源表的数据插入目标表中 。      

   1.2 通过参数 ,会计期(一个会计期 = 1个月 ,格式为 年-月 )更新目标表的部分数据 ,对会计期内的数据 进行全量的更新 

      每次更新,只更新目标表最近一个会计期的数据 ,

      更新之前先根据 参数 删除 会计期 内的数据,然后查询源表会计期的数据插入到目标表中。

 

 

 2 增量数据同步 

   2.1 不带参数的实现方式

     更新目标表之前,会判断 源表的数据在目标表中是否存在

     存在 则用源表的数据 更新 目标表中的数据。

     不存在 那么直接将源表的数据 插入到 目标表中 。   

   2.2 使用参数的切片全量 ,使用参数 实现 只更新表切片的数据 不做全表的增量同步 。

     更新目标表之前,会判断 源表的 切片的范围内的 数据  在目标表   切片的范围内  是否存在

     存在 则用源表的数据 更新 目标表中的数据。

     不存在 那么直接将源表的数据 插入到 目标表中 。

       

 -------------------------------------- 增量的方式更新 EMP_BAK

  增量同步有2种方式实现:

  1 游标 CURSOR 

  2 MERGE INTO 

  

  -----------  游标  CURSOR 实现

CREATE OR REPLACE PROCEDURE  SP_EMP_BAK_CURSOR 

  IS 

  -- 先定义一个游标 指向 源表的结果 

  CURSOR C_EMP  IS  SELECT * FROM EMP   ; 

  V_CT   NUMBER(4) ;

BEGIN 

   -- 通过循环 从游标中取数 

  FOR X IN C_EMP LOOP

      -- 循环内 通过条件控制判断 源表的数据 在 目标表中 是否存在 

     SELECT COUNT(*)  INTO  V_CT   FROM  EMP_BAK  WHERE EMPNO = X.EMPNO ;

       -- V_CT 的结果 只会等于 1 或者 0 , 1 表示存在, 0 不存在。

     

      -- 判断 目标表的数据在  源表中是否存在 

     IF  V_CT  = 1 THEN 

       UPDATE EMP_BAK M

       SET 

          M.ENAME     =    X.ENAME,

          M.JOB       =    X.JOB,

          M.MGR       =    X.MGR,

          M.HIREDATE  =    X.HIREDATE,

          M.SAL       =    X.SAL,

          M.COMM      =    X.COMM,

          M.DEPTNO    =    X.DEPTNO,

          M.DATA_DATE =   SYSDATE 

       WHERE M.EMPNO = X.EMPNO ;

     

     -- 判断 目标表中  在 源表数据 不存在 ,则 插入  

    ELSIF  V_CT = 0 THEN 

      INSERT INTO EMP_BAK(EMPNO,

                          ENAME,

                          JOB,

                          MGR,

                          HIREDATE,

                          SAL,

                          COMM,

                          DEPTNO,

                          DATA_DATE)

                          VALUES(

                          X.EMPNO,

                          X.ENAME,

                          X.JOB,

                          X.MGR,

                          X.HIREDATE,

                          X.SAL,

                          X.COMM,

                          X.DEPTNO,

                     SYSDATE );

    END IF ;

  END LOOP ;

  COMMIT ;

END SP_EMP_BAK_CURSOR;

 

---------  调用存储过程 

BEGIN 

  SP_EMP_BAK_CURSOR;

END ;



SELECT * FROM  EMP_BAK ;

 

 

 ---------------  MERGE INTO 实现

CREATE OR REPLACE PROCEDURE SP_EMP_BAK_MERGE

  IS

BEGIN

   MERGE INTO  EMP_BAK  M   -- 目标表

   USING (SELECT *FROM EMP ) X  -- 源表

   ON (M.EMPNO = X.EMPNO)  -- 比较字段

   WHEN  MATCHED  THEN   -- 当匹配字段 找到相同的数据 则更新

     UPDATE SET   -- 这里的 UPDATE  SET 之间没有 表名 

          M.ENAME     =    X.ENAME,

          M.JOB       =    X.JOB,

          M.MGR       =    X.MGR,

          M.HIREDATE  =    X.HIREDATE,

          M.SAL       =    X.SAL,

          M.COMM      =    X.COMM,

          M.DEPTNO    =    X.DEPTNO,

          M.DATA_DATE =   SYSDATE


   WHEN  NOT MATCHED THEN     -- 当匹配字段 找 不 到相同的数据 则插入

      -- 这里的 INSERT 没有 INTO  

      INSERT     (M.EMPNO     ,

                  M.ENAME     ,

                  M.JOB       ,

                  M.MGR       ,

                  M.HIREDATE  ,

                  M.SAL       ,

                  M.COMM      ,

                  M.DEPTNO    ,

                  M.DATA_DATE )

                  VALUES(

                  X.EMPNO     ,

                  X.ENAME     ,

                  X.JOB       ,

                  X.MGR       ,

                  X.HIREDATE  ,

                  X.SAL       ,

                  X.COMM      ,

                  X.DEPTNO    ,

                  SYSDATE  );

       COMMIT ;

END  SP_EMP_BAK_MERGE ;



---------------- 调用 

BEGIN 

   SP_EMP_BAK_MERGE ;

END ;

 


SELECT * FROM EMP_BAK  FOR UPDATE ;

 

TRUNCATE TABLE EMP_BAK

  


END