---------同步数据的时候调查日志的存储过程往日志表中记录信息
--比如:全量同步emp表的数据到 EMP_TAG 表,并记录日志信息
CREATE OR REPLACE PROCEDURE SP_EMP_TAG
IS
P_SP_NAME VARCHAR2(40) := 'SP_EMP_TAG';
P_SP_STATUS VARCHAR2(10) := 'RUNNING';
P_S_DATE DATE := SYSDATE;
P_F_DATE DATE;
P_SP_DESC VARCHAR2(50) := '程序开始执行';
BEGIN
---程序开始执行的时候调用一遍插日志的sp
SP_LOG_TAB(P_SP_NAME, P_SP_STATUS, P_S_DATE, P_F_DATE, P_SP_DESC);
EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_TAG';
INSERT INTO EMP_TAG
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, CHECK_DATE)
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO,SYSDATE
FROM EMP;
COMMIT;
--P_SP_NAME VARCHAR2(40) := 'SP_EMP_TAG';
P_SP_STATUS := 'FINISHED';
--P_S_DATE DATE := SYSDATE;
P_F_DATE := SYSDATE;
P_SP_DESC := '程序执行结束';
--同步数据的操作走完后,再调用一遍插日志的sp,再插入一遍信息
SP_LOG_TAB(P_SP_NAME, P_SP_STATUS, P_S_DATE, P_F_DATE, P_SP_DESC);
END;
--测试一下
SELECT * FROM EMP_TAG;
BEGIN
SP_EMP_TAG;
END;
SELECT * FROM LOG_TAB L WHERE L.SP_NAME = 'SP_EMP_TAG';
---根据两次插入日志表的中的该同步数据的sp的日志信息,来看一下整个sp花费的时间,来判断是否需要进行性能优化
---小练习一把:增量同步emp表中的数据到 emp_tag 表,并记录每一步的日志信息
--日志表有了,插日志的sp也有了
--建表(表有了),建同步数据的sp
CREATE OR REPLACE PROCEDURE SP_EMP_TAG_CURSOR
IS
CURSOR C_EMP_TAG
IS
SELECT empno,
ename,
job,
mgr,
hiredate,
sal,
comm,
deptno
FROM EMP;
SYS_DATE DATE := SYSDATE;
CT NUMBER;
--日志表中所需要的信息
P_SP_NAME VARCHAR2(40) := 'SP_EMP_TAG_CURSOR';
P_SP_STATUS VARCHAR2(10) := 'RUNNING';
P_S_DATE DATE := SYSDATE; --=2020/9/26 15:53:20
P_F_DATE DATE;
P_SP_DESC VARCHAR2(50) := '程序开始执行';
BEGIN
--记录开始时间
SP_LOG_TAB(P_SP_NAME, P_SP_STATUS, P_S_DATE, P_F_DATE, P_SP_DESC);
FOR X IN C_EMP_TAG LOOP
SELECT COUNT(*)
INTO CT
FROM EMP_TAG T
WHERE T.EMPNO = X.EMPNO;
IF CT = 1 THEN
UPDATE EMP_TAG T SET T.ENAME = X.ENAME,
T.job = X.JOB,
T. mgr = X.MGR,
T.hiredate = X.HIREDATE,
T.sal = X.SAL,
T.comm = X.COMM,
T.deptno = X.DEPTNO,
T.CHECK_DATE = SYS_DATE
WHERE T.EMPNO = X.EMPNO;
ELSIF CT = 0 THEN
INSERT INTO EMP_TAG(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO,
CHECK_DATE)
VALUES (X.EMPNO,
X.ENAME,
X.JOB,
X.MGR,
X.HIREDATE,
X.SAL,
X.COMM,
X.DEPTNO,
SYS_DATE);
END IF;
END LOOP;
--P_SP_NAME VARCHAR2(40) := 'SP_EMP_TAG_CURSOR';
P_SP_STATUS := 'RUNNING';
--P_S_DATE DATE := SYSDATE;
P_F_DATE := SYSDATE;
P_SP_DESC := '数据同步完成';
SP_LOG_TAB(P_SP_NAME, P_SP_STATUS, P_S_DATE, P_F_DATE, P_SP_DESC);
COMMIT;
FOR X IN 1 .. 50000 LOOP
SP_EMP_M_MERGE;
END LOOP;
--P_SP_NAME VARCHAR2(40) := 'SP_EMP_TAG_CURSOR';
P_SP_STATUS := 'FINISHED';
--P_S_DATE DATE := SYSDATE;
P_F_DATE := SYSDATE;
P_SP_DESC := '提交完成';
SP_LOG_TAB(P_SP_NAME, P_SP_STATUS, P_S_DATE, P_F_DATE, P_SP_DESC);
END;
--测试一下
BEGIN
SP_EMP_TAG_CURSOR;
END;
SELECT * FROM EMP_TAG;
SELECT * FROM LOG_TAB;
TRUNCATE TABLE LOG_TAB;