oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle日志表

Oracle日志表的使用方式

作者:雷神乐乐

这篇文章主要介绍了Oracle日志表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.日志表定义

日志一般会记录:同步的源表名,同步的目标表名,步骤名称,记录行数,状态,开始时间,结束时间,备注。

2.创建日志表

CREATE TABLE log_table
(
    source_table_name VARCHAR2(100),
    target_table_name VARCHAR2(100),
    step_name         VARCHAR2(100),
    ROW_COUNT         NUMBER,
    status            VARCHAR2(30),
    start_dt          DATE,
    end_dt            DATE,
    mark              VARCHAR2(100)
);

3.开发往log_table同步数据的存储过程

CREATE OR REPLACE PROCEDURE p_log(
    p_source_table_name VARCHAR2,
    p_target_table_name VARCHAR2,
    p_step_name VARCHAR2,
    p_ROW_COUNT NUMBER,
    p_status VARCHAR2,
    p_start_dt DATE,
    p_end_dt DATE,
    p_mark VARCHAR2) IS
BEGIN
    INSERT INTO log_table
    VALUES (p_source_table_name,
            p_target_table_name,
            p_step_name,
            p_ROW_COUNT,
            p_status,
            p_start_dt,
            p_end_dt,
            p_mark);
    COMMIT;

    ---异常
EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line(SQLERRM);
END;

-- 调用存储过程
BEGIN
  p_log(p_source_table_name,
        p_target_table_name,
        p_step_name,
        p_ROW_COUNT,
        p_status,
        p_start_dt,
        p_end_dt,
        p_mark);

END;

4.开发存储过程 emp同步数据到 emp_1135

drop table emp_1135;
create table emp_1135 as select * from emp where 1 = 2;

-- 给emp_1135表添加主键
ALTER TABLE emp_1135 ADD CONSTRAINT PK_EMP_1135 PRIMARY KEY (EMPNO);

-- 创建存储过程
create or replace procedure p_19
as
    v_source varchar2(20);
    v_target varchar2(20);
    v_st     date;
    v_dt     date;
    v_ct     number;
begin
    v_st := sysdate;
    v_source := 'emp';
    v_target := 'emp_1135';
    insert into emp_1135
    select *
    from emp;
    v_ct := SQL%ROWCOUNT;
    commit;
    v_dt := sysdate;

    -- 调用日志表存储过程
    p_log(p_source_table_name=>v_source,
          p_target_table_name=>v_target,
          p_step_name=>v_source || ' to ' || v_target,
          p_ROW_COUNT=>v_ct,
          p_status=>'成功',
          p_start_dt=>v_st,
          p_end_dt=>v_dt,
          p_mark=>'');
    -- 定义异常
exception
    when others then
        p_log(p_source_table_name=>v_source,
              p_target_table_name=>v_target,
              p_step_name=>v_source || ' to ' || v_target,
              p_ROW_COUNT=>0,
              p_status=>'失败',
              p_start_dt=>v_st,
              p_end_dt=>null,
              p_mark=>SQLERRM);
end;

-- 调用存储过程
begin
    p_19;
end;
select * from emp_1135;

-- 查询日志表
select * from log_table;

再次调用存储过程

-- 调用存储过程
begin
    p_19;
end;
select * from emp_1135;

-- 查询日志表
select * from log_table;

5.开发一个存储过程

将EMP表同步到 EMP_1134,然后将通过EMP_1134这个表数据计算每个部门总薪资,同步到 EMP_SUM_SAL

CREATE TABLE emp_1134 AS SELECT * FROM emp WHERE 1=2;

-- 添加主键
alter table emp_1134 
ADD CONSTRAINT PK_EMP_1134 PRIMARY KEY (empno);

CREATE TABLE EMP_SUM_SAL (deptno NUMBER,sum_sal NUMBER);
create or replace procedure p_20 as
  v_st     date;
  v_dt     date;
  v_ct     number;
  v_source varchar2(50);
  v_dir    varchar2(50);
begin
  v_source := 'emp';
  v_dir    := 'emp_1134';
  v_st     := sysdate;
  insert into emp_1134
    select * from emp;
  v_ct := SQL%ROWCOUNT;
  commit;
  v_dt := sysdate;

  p_log(p_source_table_name => v_source,
        p_target_table_name => v_dir,
        p_step_name         => v_source || ' to ' || v_dir,
        p_ROW_COUNT         => v_ct,
        p_status            => '成功',
        p_start_dt          => v_st,
        p_end_dt            => v_dt,
        p_mark              => '');
  -------------------------------------------------------
  v_source := 'emp_1134';
  v_dir    := 'EMP_SUM_SAL';
  v_st     := sysdate;
  insert into EMP_SUM_SAL
    select deptno, sum(sal) from emp_1134 group by deptno;
  v_ct := SQL%ROWCOUNT;
  commit;
  v_dt := sysdate;

  p_log(p_source_table_name => v_source,
        p_target_table_name => v_dir,
        p_step_name         => v_source || ' to ' || v_dir,
        p_ROW_COUNT         => v_ct,
        p_status            => '成功',
        p_start_dt          => v_st,
        p_end_dt            => v_dt,
        p_mark              => '');
  ---异常处理
EXCEPTION
  WHEN OTHERS THEN
    -- dbms_output.put_line(SQLERRM);
    -- RAISE; 可以添加弹窗
    p_log(p_source_table_name => v_source,
          p_target_table_name => v_dir,
          p_step_name         => v_source || ' to ' || v_dir,
          p_ROW_COUNT         => 0,
          p_status            => '失败',
          p_start_dt          => v_st,
          p_end_dt            => NULL,
          p_mark              => SQLERRM);
end;

begin
  p_20;
end;
-- 查询日志表
select * from log_table;

select * from emp_1134;

select * from EMP_SUM_SAL;

再次调用存储过程

begin
  p_20;
end;
-- 查询日志表
select * from log_table;

select * from emp_1134;

select * from EMP_SUM_SAL;

第二次调用存储过程时,因为emp_1134有主键,所以当第二次insert到emp_1134时检测到异常,直接抛出,不会往下走

6.日志表的功能

通过写日志表,能够记录存储过程哪一个步骤执行成功,哪一个步骤执行失败了,以及能记录 每个步骤的 执行时间,方便开发者后期对其优化,以及方便,检查。

----创建目标表  
CREATE TABLE dept_1123 AS SELECT * FROM dept WHERE 1 = 2;

----开发存储过程
CREATE OR REPLACE PROCEDURE p_dept
    IS
    v_rowcount NUMBER;
    v_start_dt DATE;
    v_end_dt   DATE;
BEGIN
    v_start_dt := SYSDATE;
    ----清空目标表
    EXECUTE IMMEDIATE 'truncate table dept_1123';
    -----插入数据
    INSERT INTO dept_1123
    SELECT *
    FROM dept;

    v_rowcount := SQL%ROWCOUNT;
    COMMIT;
    v_end_dt := SYSDATE;

    p_log(p_source_table_name =>'dept',
          p_target_table_name => 'dept_1123',
          p_step_name =>'dept同步数据到dept_1123',
          p_ROW_COUNT => v_rowcount,
          p_status => 'success',
          p_start_dt => v_start_dt,
          p_end_dt => v_end_dt,
          p_mark =>'执行成功');

    -------异常处理
EXCEPTION
    WHEN OTHERS
        THEN dbms_output.put_line(SQLERRM);
        p_log(p_source_table_name =>'dept',
              p_target_table_name => 'dept_1123',
              p_step_name =>'dept同步数据到dept_1123',
              p_ROW_COUNT => 0,
              p_status => 'fail',
              p_start_dt => v_start_dt,
              p_end_dt => NULL,
              p_mark =>SQLERRM);
        RAISE;
END;

----调用
BEGIN
    p_dept;
END;


----验证
SELECT * FROM dept_1123;

SELECT * FROM log_table;

7.日志表总结

日志表的模板 以及 调用写日志存储过程 在项目组中已经落地好了,我们直接开发存储过程里面的同步逻辑,然后对照着套着写日志就可以了。

日志的核心功能点:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文