-- 数据同步
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