使用日志的目录 :
1、记录程序执行的过程 。
2、通过日志可以分析 异常 对定位BUG很有帮助 。

我们一般通过分析错误日志 定位问题 。

oracle的日志 可以存放在我们的日志表中
CREATE TABLE T_LOG(LOG_ID VARCHAR2(32) ,
SP_NAME VARCHAR2(30) ,
SP_STATUS VARCHAR2(10) ,
SP_ST_DATE DATE ,
SP_FSDATE DATE ,
SP_DESC VARCHAR2(50)
) ;

SELECT * FROM T_LOG ;

/ SELECT sys_GUID() FROM DUAL ; sys_GUID() 在oracle中通常作为 日志表的 ID 主键数据 。
SP_NAME VARCHAR2(30) 因为开发规范要求 对象名称 不允许超过 30 个字符 。
/

记录日志的逻辑 :

CREATE PROCEDURE SP_XXXX
IS
BEGIN
在开始同步数 据之前记录一次开始日志 ,通过调用 记录日志的存储过程实现。

/ 中间是我们存储过程 更新数据的执行体 。 /

在同步数据完成以后 记录一次完成日志 ,通过调用 记录日志的存储过程实现。

END ;

--- 每次记录日志 都需要 重复 INSERT INTO 日志表
我们可以通过存储过程 封装记录日志的动作/过程

CREATE OR REPLACE PROCEDURE SP_T_LOG(P_SPNAME IN VARCHAR2 , -- 过程名
P_STATUS IN VARCHAR2 , -- 执行状态
P_S_DATE IN DATE , -- 开始时间
P_F_DATE IN OUT DATE , -- 完成时间
P_DESC IN OUT VARCHAR2 -- 描述
)
IS
BEGIN
INSERT INTO T_LOG(LOG_ID, -- 主键 ID
SP_NAME, -- 过程名
SP_STATUS, -- 执行状态
SP_ST_DATE, -- 开始时间
SP_FSDATE, -- 完成时间
SP_DESC -- 描述
)
VALUES(
SYS_GUID() , -- 主键 ID
P_SPNAME , -- 过程名
P_STATUS , -- 执行状态
P_S_DATE , -- 开始时间
P_F_DATE , -- 完成时间
P_DESC -- 描述
);
COMMIT ;
END ;

-- 将之前写好的存储过程 添加日志

CREATE OR REPLACE PROCEDURE SP_EMP_BAK
IS
-- 定义记录日志所需的变量
V_SP_NAME VARCHAR2(30) ;
V_SP_STATUS VARCHAR2(10) ;
V_ST_DATE DATE ;
V_FS_DATE DATE ;
V_SP_DESC VARCHAR2(50) ;
BEGIN
-- 初始化变量
V_SP_NAME := 'SP_EMP_BAK' ;
V_SP_STATUS := '开始' ;
V_ST_DATE := SYSDATE ;
V_SP_DESC := '全量同步 目标表 EMP_BAK' ;
-- 同步数据之前记录开始日志
SP_T_LOG(V_SP_NAME ,
V_SP_STATUS ,
V_ST_DATE ,
V_FS_DATE,
V_SP_DESC ) ;

-- 先清空目标表的数据 ,为了支持 重跑
/ DELETE FROM EMP_BAK WHERE 1 = 1 ; / -- 如果公司不允许使用 TRUNCATE 那么可以使用 DELETE 对表中的数据进行删除 。
-- DDL语句不能直接在 PLSQL 中使用 所以需要使用 动态SQL
EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_BAK ' ;
-- 然后 将源表 EMP 的数据 插入到 目标表 EMP_BAK 中
INSERT INTO EMP_BAK(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO ,
DATA_DATE)
SELECT
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO ,
SYSDATE
FROM EMP ;
COMMIT ;

----------------- 同步数据完成 记录结束日志
-- 再次初始化变量

V_SP_STATUS := '完成' ;
V_FS_DATE := SYSDATE ; -- 同步完成以后 将完成时间记录为当前的时间
V_SP_DESC := '完成 全量同步 目标表 EMP_BAK' ;
-- 同步数据之前记录开始日志
SP_T_LOG(V_SP_NAME ,
V_SP_STATUS ,
V_ST_DATE ,
V_FS_DATE,
V_SP_DESC ) ;

END SP_EMP_BAK;

--- 调用存储过程
BEGIN
SP_EMP_BAK ;
END ;

-- 查询目标表中数据是否刷新
SELECT FROM EMP_BAK ;
-- 查询日志表是否正常记录了执行日志
SELECT
FROM T_lOG ;

-- 将之前写好的存储过程 添加日志

CREATE OR REPLACE PROCEDURE SP_EMP_BAK3 IS
-- 定义记录日志所需的变量
V_SP_NAME VARCHAR2(30) ;
V_SP_STATUS VARCHAR2(10) ;
V_ST_DATE DATE ;
V_FS_DATE DATE ;
V_SP_DESC VARCHAR2(50) ;
BEGIN
-- 初始化变量
V_SP_NAME := 'SP_EMP_BAK3' ;
V_SP_STATUS := '开始' ;
V_ST_DATE := SYSDATE ;
V_SP_DESC := '全量同步 目标表 EMP_BAK3' ;
-- 同步数据之前记录开始日志
SP_T_LOG(V_SP_NAME ,
V_SP_STATUS ,
V_ST_DATE ,
V_FS_DATE,
V_SP_DESC ) ;

       ------------------------------- 同步数据开始 ----------------------

DELETE FROM EMP_BAK3 WHERE 1 = 1;

INSERT INTO EMP_BAK3(DEPTNO,
DNAME,
CT_EMPNO,
AVG_SAL,
DATA_DATE)
SELECT E.DEPTNO, D.DNAME, COUNT(E.EMPNO), ROUND(AVG(E.SAL),2), SYSDATE
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY E.DEPTNO, D.DNAME;

COMMIT;
------------------------------- 同步数据完成----------------------

-- 再次初始化变量 

V_SP_STATUS := '完成' ;
V_FS_DATE := SYSDATE ; -- 同步完成以后 将完成时间记录为当前的时间
V_SP_DESC := '完成 全量同步 目标表 EMP_BAK3' ;
-- 同步数据之前记录开始日志
SP_T_LOG(V_SP_NAME ,
V_SP_STATUS ,
V_ST_DATE ,
V_FS_DATE,
V_SP_DESC ) ;

END SP_EMP_BAK3;

----- 通过复制粘贴的方式 完成了 第二个存储过程 监控日志
调用存储过程 验证功能是否正常
BEGIN
SP_EMP_BAK3;
END;

SELECT FROM EMP_BAK3 ;
SELECT
FROM T_LOG ;