全量同步
-- 实现逻辑:用源表的数据直接覆盖目标表
-- 插入数据前:先清空目标表,然后查询源表的数据,插入目标表
-- 1. 先创建一个目标表
CREATE TABLE EMP_T AS
SELECT
E.*,
SYSDATE CREATE_DATE,
SYSDATE UPDATE_DATE,
SYSDATE ETL_DATE
FROM EMP E
WHERE 1=2;SELECT * FROM EMP_T;
-- 2. 创建一个来源表
CREATE TABLE EMP_S
AS
SELECT
E.*,
SYSDATE-1 CREATE_DATE,
SYSDATE-1 UPDATE_DATE
FROM EMP E
--3. 创建一个存储过程实现数据从源表同步到目标表
CREATE OR REPLACE PROCEDURE SP_EMP_MERGE
IS
V_COUNT NUMBER;
BEGIN-- 判断表中是否有数据,如果有,则清空数据SELECT COUNT(1) INTO V_COUNT FROM EMP_T;IF V_COUNT != 0 THEN--如果行数不等于0,则说明有数据,就执行清空表的语句EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_T';END IF;-- 根据源表的结果集插入到目标表中
INSERT INTO EMP_T(
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO,
CREATE_DATE,
UPDATE_DATE,
ETL_DATE)SELECT S.EMPNO,S.ENAME,S.JOB,S.MGR,S.HIREDATE,S.SAL,S.COMM,S.DEPTNO,S.CREATE_DATE,S.UPDATE_DATE,SYSDATEFROM EMP_S S;
EXCEPTIONWHEN OTHERS THEN ROLLBACK;DBMS_OUTPUT.put_line(SQLERRM);
END;
调用存储过程
BEGINSP_EMP_MERGE();
END;SELECT * FROM EMP_T;
-- 需要注意的是:
1. 开发规范:存储过程名,一般不超过 40个 字符长度
2. 在存储过程中,尽量不要使用通配符 * 来查询
3. 在 DML 语句中,给每张表取个别名
4. 在 执行 DML 语句之后,不要忘记了 COMMIT
5. 在全量同步的时候,先检查源表是否有数据