存储过程 -- 全量数据同步

全量抽取

将目标表的数据全部删除,再将源系统的数据全部插入目标表。
注意:此方法保证了数据的质量,但是对于数据量大的表而言,性能太差。

①备份表 、 备份表结构

--表结构和数据一起备份到目标表
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;

在这里插入图片描述

发布了30 篇原创文章 · 获赞 3 · 访问量 6962

猜你喜欢

转载自blog.csdn.net/ferlylao/article/details/104092275