• 全表对比增量抽取


    全表对比增量抽取

    1 概述

    在做数据仓库系统时,增量数据抽取是必不可少的环节,目前实现增量数据的方式有很多,如:时间戳、触发器,CDC,归档日志,全表删除后全量抽取以及全表对比增量抽取等,本次案例只对全表对比增量抽取讲解。

    2 创建源表和目标表

    -- 新建源表

    create table increasea

    (

      ID            VARCHAR2(30) NOT NULL,

      DATEID        VARCHAR2(50),

      DEPARTMENTID  VARCHAR2(50),

      EMPID         VARCHAR2(50),

      EMPNAME       VARCHAR2(100),

      SALARY        NUMBER(18,2),

      STATUS        VARCHAR2(50)

    );

    ALTER TABLE increasea ADD CONSTRAINT PKINCREASE PRIMARY KEY (ID);

    -- 新建目标表

    create table increaseb

    (

      ID            VARCHAR2(30) NOT NULL,

      DATEID        VARCHAR2(50),

      DEPARTMENTID  VARCHAR2(50),

      EMPID         VARCHAR2(50),

      EMPNAME       VARCHAR2(100),

      SALARY        NUMBER(18,2),

      STATUS        VARCHAR2(50)

    );

    ALTER TABLE increaseb ADD CONSTRAINT PKINCREASEB PRIMARY KEY (ID);

    3 监控源表中新增、修改、删除的数据

    -- 本条SQL可以监控源表中的新增和修改的数据

    SELECT * FROM INCREASEA MINUS SELECT * FROM INCREASEB;

    -- 本条SQL可以监控源表中删除的数据

    SELECT * FROM INCREASEB MINUS SELECT * FROM INCREASEA;

    4 存储过程实现增量抽取

    CREATE OR REPLACE PROCEDURE INCREASEETL AS

    BEGIN

      -- 找出所有新增、修改的数据,然后根据ID主键删除目标表中未修改的数据,之后插入所有新增、修改的数据

      DELETE FROM INCREASEB

       WHERE ID IN

             (SELECT ID

                FROM (SELECT * FROM INCREASEA MINUS SELECT * FROM INCERASEB) a);

      COMMIT;

      INSERT INTO INCREASEB

        SELECT *

          FROM (SELECT * FROM INCREASEA MINUS SELECT * FROM INCREASEB) b;

      COMMIT;

      -- 找出所有源表中删除的数据,删除目标表中相关删除的数据

      DELETE FROM INCREASEB

       WHERE ID IN

             (SELECT ID

                FROM (SELECT * FROM INCREASEB MINUS SELECT * FROM INCREASEA) c);

      COMMIT;

    END;

    5 测试

    1)源表新增数据

    INSERT INTO INCREASEA(ID,EMPNAME) VALUES(3,'wangwu');

    commit;

    调用一次存储过程INCREASEETL

    begin

      -- Call the procedure

      increaseetl;

    end;

    查看目标表

    SELECT * FROM INCREASEB;

     

    2)源表修改数据

    UPDATE INCREASEA SET EMPNAME = 'ZHAOLIU' WHERE ID = '3';

    COMMIT;

    调用一次存储过程INCREASEETL

    begin

      -- Call the procedure

      increaseetl;

    end;

    查看目标表

    SELECT * FROM INCREASEB;

     

    3)源表删除数据

    DELETE FROM INCREASEA WHERE ID = '3';

    COMMIT;

    调用一次存储过程INCREASEETL

    begin

      -- Call the procedure

      increaseetl;

    end;

    查看目标表

    SELECT * FROM INCREASEB;

     

    6 备注

    在测试过程中,每次执行存储过程的原因是:此存储过程用于每天调度执行增量抽取,实现ETL每天定时抽取数据。

    本案例适用于数据量较小的业务。

  • 相关阅读:
    Java 代码界 3% 的王者?看我是如何解错这 5 道题的
    你想成为什么级别的程序员?
    我竟然不再抗拒 Java 的类加载机制了
    程序员,你自豪什么
    你竟然没用 Maven 构建项目?
    一名合格的程序员应该是什么样子
    TDD(测试驱动开发)死了吗?
    Java Serializable:明明就一个空的接口嘛
    一个理想主义的程序员
    教妹学 Java:动态伴侣 Groovy
  • 原文地址:https://www.cnblogs.com/nbjin/p/10884396.html
Copyright © 2020-2023  润新知