增量抽取
只需抽取新增的或修改的数据。此方法性能好,但容易遗漏。
目标表中有,但是源表中没有的话,更新不了。
以时间戳取增量,对源表删除的数据无能为力。
通过源表更新目标表的时候,通常是先判断 源表中的数据在目标表中是否存在(通过主键判断)
如果存在,那么就用源表的数据,更新目标表的数据。
如果不存在,那么就直接从源表中插入数据到目标表。
------------------------------------- 使用游标进行增量数据同步 -------------------------------------
①创建增量数据同步存储过程
CREATE OR REPLACE PROCEDURE SP_EMP_BACK2
IS
CURSOR C_EMP IS --声明游标指向结果集
SELECT * FROM EMP;
V_EMP C_EMP%ROWTYPE;
V_CT NUMBER(5);
V_MARK NUMBER(5);
BEGIN
--初始化变量
V_MARK := SEQ_TEST2.NEXTVAL;--序列值
FOR V_EMP IN C_EMP LOOP
SELECT COUNT(1)
INTO V_CT
FROM EMP_BACK1
-- 比较字段,通过主键 empno 判断员工信息是否存在于目标表
WHERE EMPNO = V_EMP.EMPNO;
-- 判断源表中的数据在目标表中存在,存在则用源表中的数据更新目标表
IF V_CT = 1 THEN
UPDATE EMP_BACK1 M
SET -- 这里更新的时候,不能更新 比较字段。
M.ENAME = V_EMP.ENAME,
M.JOB = V_EMP.JOB,
M.MGR = V_EMP.MGR,
M.HIREDATE = V_EMP.HIREDATE,
M.SAL = V_EMP.SAL,
M.COMM = V_EMP.COMM,
M.DEPTNO = V_EMP.DEPTNO,
M.DATA_DATE = SYSDATE,
M.MARK = V_MARK
WHERE EMPNO = V_EMP.EMPNO;
-- 判断源表中的数据,在目标表中不存在,那么就插入数据
ELSIF V_CT = 0 THEN
INSERT INTO EMP_BACK1
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO,
DATA_DATE,
MARK)
VALUES
(V_EMP.EMPNO,
V_EMP.ENAME,
V_EMP.JOB,
V_EMP.MGR,
V_EMP.HIREDATE,
V_EMP.SAL,
V_EMP.COMM,
V_EMP.DEPTNO,
SYSDATE,
V_MARK);
END IF;
END LOOP;
COMMIT;
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
②调用存储过程
BEGIN
SP_EMP_BACK2;
END ;
1
2
3
③检查目标表中的数据,是否按照增量同步的逻辑,存在则更新,不存在,则插入。
SELECT * FROM EMP_BACK1 ;
1
---------------------- 使用 merge into 的方式实现增量同步 -----------------------------
①创建增量数据同步存储过程
CREATE OR REPLACE PROCEDURE SP_EMP_BACK3 IS
V_MARK NUMBER(5);
BEGIN
V_MARK := SEQ_TEST2.NEXTVAL;
MERGE INTO EMP_BACK1 M -- 使用 merge into 更新目标表 EMP_BACK1
USING (SELECT * FROM EMP) E -- 使用 () 内的查询结果
ON (M.EMPNO = E.EMPNO) -- 通过 on 后面的条件比较
-- 判断源表中数据在目标表中存在,则更新
WHEN MATCHED THEN -- 当 on 后面的条件比较 匹配上数据,then 更新
UPDATE
SET -- 比较字段 empno 不能更新
M.ENAME = E.ENAME,
M.JOB = E.JOB,
M.MGR = E.MGR,
M.HIREDATE = E.HIREDATE,
M.SAL = E.SAL,
M.COMM = E.COMM,
M.DEPTNO = E.DEPTNO,
M.DATA_DATE = SYSDATE,
M.MARK = V_MARK -- 这里不加分号 ,分号表示程序执行到这里结束
-- 判断源表中的数据在目标表不存在,则插入
WHEN NOT MATCHED THEN -- 当 on 后面的条件比较 匹配不到数据,then 插入
INSERT
(M.EMPNO,
M.ENAME,
M.JOB,
M.MGR,
M.HIREDATE,
M.SAL,
M.COMM,
M.DEPTNO,
M.DATA_DATE,
M.MARK)
VALUES
(E.EMPNO,
E.ENAME,
E.JOB,
E.MGR,
E.HIREDATE,
E.SAL,
E.COMM,
E.DEPTNO,
SYSDATE,
V_MARK);
COMMIT;
END;
②调用存储过程
BEGIN
SP_EMP_BACK3;
END ;
③ 验证结果是否正确
SELECT * FROM EMP_BACK1 ;
————————————————
版权声明:本文为CSDN博主「ferlylao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ferlylao/article/details/104092918