全量抽取
将目标表的数据全部删除,再将源系统的数据全部插入目标表。
注意:此方法保证了数据的质量,但是对于数据量大的表而言,性能太差。
①备份表 、 备份表结构
--表结构和数据一起备份到目标表
CREATE TABLE EMP_BACK AS (SELECT * FROM EMP );
--只备份了表结构
CREATE TABLE EMP_BACK1 AS (SELECT * FROM EMP WHERE 1 = 2 );
②在目标表中增加检查字段,方便我们判断数据是否真的更新了。
ALTER TABLE EMP_BACK1 ADD DATA_DATE DATE; --新增时间戳字段
ALTER TABLE EMP_BACK1 ADD mark NUMBER(10); --新增了序列字段
③在目标表中增加主键,确保数据的唯一性
ALTER TABLE EMP_BACK1 ADD CONSTRAINT PK_EMP_BACK1 PRIMARY KEY(EMPNO);
④TRUNCATE TABLE EMP_BACK1 清空目标表中数据
创建全量数据同步存储过程
①创建全量同步存储过程
CREATE OR REPLACE PROCEDURE SP_EMP_BACK1 --创建存储过程SP_EMP_BACK1
IS
V_MARK NUMBER(10);--声明变量
BEGIN
-- 初始化变量
V_MARK := seq_test2.nextval;--序列下一个值
-- 使用动态SQL 清空目标表,让存储过程支持重跑
-- 第一种 删除效率比较高,但是必须使用动态SQL执行
/*EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_BACK1 ' ;*/
-- 第二种 直接使用delete 语句删除,记得加条件。
DELETE FROM EMP_BACK1 WHERE 1 = 1;
INSERT INTO EMP_BACK1(empno,
ename,
job,
mgr,
hiredate,
sal,
comm,
deptno,
DATA_DATE,
MARK)
SELECT
empno,
ename,
job,
mgr,
hiredate,
sal,
comm,
deptno,
SYSDATE,
V_MARK
FROM EMP_BACK ;
COMMIT; --提交
END ;
②调用存储哦过程全量同步数据
BEGIN
SP_EMP_BACK1;
END ;
③查询目标表数据是否已同步到目标表
SELECT * FROM EMP_BACK1;
练习
建个目标表 EMP_SALES (DEPTNO ,DNAME ,SAL_L1,SAL_L2,SAL_L3,mark) SAL_L1 ~ SAL_L3 分别对应工资排名前1~3
检查字段,要求使用 序列实现。
编写存储过程,使用全量同步的方式,更新目标表 EMP_SALES
①创建表结构
create table emp_sales(
DEPTNO number(7,2),
DNAME varchar2(20),
SAL_L1 number(7,2),
SAL_L2 number(7,2),
SAL_L3 number(7,2),
mark number(10)
);
②源表数据
WITH E AS
(SELECT X.DEPTNO,X.DNAME,X.SAL,X.RN
FROM(
SELECT d.deptno,
d.dname,
e.sal,
dense_rank()OVER(PARTITION BY d.deptno ORDER BY e.sal DESC) RN
FROM emp e,dept d
WHERE e.deptno = d.deptno) X
WHERE X.RN <=3)
SELECT E.DEPTNO,
E.DNAME,
MAX(CASE RN WHEN 1 THEN E.SAL END) SAL_L1,
MAX(CASE RN WHEN 2 THEN E.SAL END) SAL_L2,
MAX(CASE RN WHEN 3 THEN E.SAL END) SAL_L3
FROM E
GROUP BY E.DEPTNO,E.DNAME;
③创建序列
CREATE SEQUENCE MYSEQ
MINVALUE 1
START WITH 1
NOMAXVALUE
INCREMENT BY 1
NOCYCLE
NOCACHE
④创建全量同步存储过程
CREATE OR REPLACE PROCEDURE SP_QL_EMP_BACK
IS
V_MARK NUMBER(10);--声明变量
BEGIN
V_MARK := MYSEQ.NEXTVAL;
-- 第一种 删除效率比较高,但是必须使用动态SQL执行
--先清空目标表
EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_SALES ' ;
INSERT INTO EMP_SALES(DEPTNO,
DNAME,
SAL_L1,
SAL_L2,
SAL_L3,
MARK)
SELECT
DEPTNO,
DNAME,
SAL_L1,
SAL_L2,
SAL_L3,
V_MARK
FROM
(WITH E AS
(SELECT X.DEPTNO,X.DNAME,X.SAL,X.RN
FROM(
SELECT d.deptno,
d.dname,
e.sal,
dense_rank()OVER(PARTITION BY d.deptno ORDER BY e.sal DESC) RN
FROM emp e,dept d
WHERE e.deptno = d.deptno) X
WHERE X.RN <=3)
SELECT E.DEPTNO,
E.DNAME,
MAX(CASE RN WHEN 1 THEN E.SAL END) SAL_L1,
MAX(CASE RN WHEN 2 THEN E.SAL END) SAL_L2,
MAX(CASE RN WHEN 3 THEN E.SAL END) SAL_L3
FROM E
GROUP BY E.DEPTNO,E.DNAME
)
COMMIT;
END ;
⑤调用存储过程
BEGIN
SP_QL_EMP_BACK;
END;
⑥查询数据是否已同步到目标表
SELECT * FROM EMP_SALES;