PL/SQL全量同步

全量同步

-- 实现逻辑:用源表的数据直接覆盖目标表
-- 插入数据前:先清空目标表,然后查询源表的数据,插入目标表

-- 1. 先创建一个目标表

CREATE TABLE EMP_T AS
SELECT 
E.*,
SYSDATE CREATE_DATE,
SYSDATE UPDATE_DATE,
SYSDATE ETL_DATE
FROM EMP E
WHERE 1=2;

SELECT * FROM EMP_T;

-- 2. 创建一个来源表

CREATE TABLE EMP_S
AS
SELECT 
E.*,
SYSDATE-1 CREATE_DATE,
SYSDATE-1 UPDATE_DATE
FROM EMP E

--3. 创建一个存储过程实现数据从源表同步到目标表

CREATE OR REPLACE PROCEDURE SP_EMP_MERGE
IS
V_COUNT NUMBER;
BEGIN
 -- 判断表中是否有数据,如果有,则清空数据
 SELECT COUNT(1) INTO V_COUNT FROM EMP_T;
 IF V_COUNT != 0 THEN
   --如果行数不等于0,则说明有数据,就执行清空表的语句
   EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_T';
  END IF;
  -- 根据源表的结果集插入到目标表中
INSERT INTO EMP_T(
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO,
CREATE_DATE,
UPDATE_DATE,
ETL_DATE)
  SELECT S.EMPNO,
         S.ENAME,
         S.JOB,
         S.MGR,
         S.HIREDATE,
         S.SAL,
         S.COMM,
         S.DEPTNO,
         S.CREATE_DATE,
         S.UPDATE_DATE,
         SYSDATE
    FROM EMP_S S;
EXCEPTION
  WHEN OTHERS THEN 
    ROLLBACK;
 DBMS_OUTPUT.put_line(SQLERRM);     
END;

调用存储过程

BEGIN
  SP_EMP_MERGE();
END;

SELECT * FROM EMP_T;

-- 需要注意的是:
1. 开发规范:存储过程名,一般不超过 40个 字符长度
2. 在存储过程中,尽量不要使用通配符 * 来查询
3. 在 DML 语句中,给每张表取个别名
4. 在 执行 DML 语句之后,不要忘记了 COMMIT
5. 在全量同步的时候,先检查源表是否有数据

你可能感兴趣的:(PL/SQL,sql,数据库)