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;
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;