PL/SQL增量同步

PL/SQL全量同步_枯河垂钓的博客-CSDN博客

目录

增量同步 

增量同步存储过程

ORACEL 独有的 增量更新  merge into


增量同步 

逻辑: 用源表的数据更新目标表,数据存在则更新,数据不存在,则插入
实现的逻辑:
1. 首先判断目标表是否有源表的数据
2. 如果有,则用源表的数据更新目标表
3. 如果没有,则查询源表的数据,直接插入

-- 造增量数据 

INSERT INTO EMP_S(EMPNO,CREATE_DATE,UPDATE_DATE)VALUES(123,SYSDATE,SYSDATE);
INSERT INTO EMP_S(EMPNO,CREATE_DATE,UPDATE_DATE)VALUES(777,SYSDATE,SYSDATE);
COMMIT;

UPDATE EMP_S S SET S.SAL=1000,S.UPDATE_DATE=SYSDATE WHERE S.EMPNO=7369;
COMMIT;
增量同步存储过程
CREATE OR REPLACE PROCEDURE SP_EMP_UPDATE (P_START_DATE IN DATE,P_END_DATE DATE)
IS
-- 创建一个游标,获取源表输入时间范围内的数据
CURSOR 
CURSOR_EMP (P_START_DATE DATE,P_END_DATE DATE) IS
SELECT 
S.EMPNO,
S.ENAME,
S.JOB,
S.MGR,
S.HIREDATE,
S.SAL,
S.COMM,
S.DEPTNO,
S.CREATE_DATE,
S.UPDATE_DATE
FROM EMP_S S
WHERE S.UPDATE_DATE >= P_START_DATE AND S.UPDATE_DATE <= P_END_DATE;

V_COUNT NUMBER;
BEGIN
  -- 循环判断游标里,存储的目标表数据
 FOR X IN  CURSOR_EMP(P_START_DATE,P_END_DATE) LOOP
   SELECT 
   COUNT(1)
   INTO  
   V_COUNT
   FROM EMP_T T
   WHERE T.EMPNO=X.EMPNO;
  
IF V_COUNT=0 THEN 
  INSERT INTO EMP_T E (
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO,
CREATE_DATE,
UPDATE_DATE,
ETL_DATE )  
VALUES (
X.EMPNO,
X.ENAME,
X.JOB,
X.MGR,
X.HIREDATE,
X.SAL,
X.COMM,
X.DEPTNO,
X.CREATE_DATE,
X.UPDATE_DATE,
SYSDATE);
ELSE 
  UPDATE EMP_T E
  SET 
E.EMPNO        =X.EMPNO,
E.ENAME        =X.ENAME,
E.JOB          =X.JOB,
E.MGR          =X.MGR,
E.HIREDATE     =X.HIREDATE,
E.SAL          =X.SAL,
E.COMM         =X.COMM,
E.DEPTNO       =X.DEPTNO,
E.CREATE_DATE  =X.CREATE_DATE,
E.UPDATE_DATE  =X.UPDATE_DATE,
E.ETL_DATE     = SYSDATE
WHERE E.EMPNO=X.EMPNO;
END IF ;
END LOOP;

EXCEPTION WHEN OTHERS THEN
  DBMS_OUTPUT.put_line(SQLERRM);

END SP_EMP_UPDATE;
/

调用存储过程

BEGIN
  SP_EMP_UPDATE(TO_DATE('20230729 00:00:00','yyyymmdd hh24:mi:ss'),TO_DATE('20230729 23:59:59','yyyymmdd hh24:mi:ss'));
END;

SELECT * FROM EMP_T;
ORACEL 独有的 增量更新  merge into
MERGE INTO 目标表
USING (增量数据的查询结果集)
ON (匹配字段)
WHEN MATCHED 
  THEN UPDATE SET -- UPDATE 和 SET 之间不需要加表名
WHEN NOT MATCHED
  THEN INSERT VALUES -- INSERT 和 VALUES 之间 不需要加 表名

merge into案例

CREATE OR REPLACE PROCEDURE SP_MERGEINTO_EMP
IS
BEGIN
  MERGE INTO EMP_T T 
USING (
SELECT
S.EMPNO,
S.ENAME,
S.JOB,
S.MGR,
S.HIREDATE,
S.SAL,
S.COMM,
S.DEPTNO,
S.CREATE_DATE,
S.UPDATE_DATE
FROM EMP_S S
)  E -- 查询源表的结果集
ON (T.EMPNO=E.EMPNO) 
WHEN MATCHED THEN
  UPDATE SET 
T.ENAME        =E.ENAME,
T.JOB          =E.JOB,
T.MGR          =E.MGR,
T.HIREDATE     =E.HIREDATE,
T.SAL          =E.SAL,
T.COMM         =E.COMM,
T.DEPTNO       =E.DEPTNO,
T.CREATE_DATE  =E.CREATE_DATE,
T.UPDATE_DATE  =E.UPDATE_DATE,
T.ETL_DATE     = SYSDATE
WHEN NOT MATCHED THEN
  INSERT (
  T.EMPNO,
  T.ENAME,
  T.JOB,
  T.MGR,
  T.HIREDATE,
  T.SAL,
  T.COMM,
  T.DEPTNO,
  T.CREATE_DATE,
  T.UPDATE_DATE,
  T.ETL_DATE
  )
  VALUES(
  E.EMPNO,
  E.ENAME,
  E.JOB,
  E.MGR,
  E.HIREDATE,
  E.SAL,
  E.COMM,
  E.DEPTNO,
  E.CREATE_DATE,
  E.UPDATE_DATE,
  SYSDATE 
  );
 EXCEPTION WHEN OTHERS THEN 
   ROLLBACK;
   DBMS_OUTPUT.PUT_LINE(SQLERRM);
  
END SP_MERGEINTO_EMP;  

调用

BEGIN
  SP_MERGEINTO_EMP();
END;

SELECT * FROM EMP_T;

你可能感兴趣的:(PL/SQL,oracle)