Oracle日志表的使用方式
目录
- 1.日志表定义
- 2.创建日志表
- 3.开发往log_table同步数据的存储过程
- 4.开发存储过程 emp同步数据到 emp_1135
- 5.开发一个存储过程
- 6.日志表的功能
- 7.日志表总结
1.日志表定义
日志一般会记录:同步的源表名,同步的目标表名,步骤名称,记录行数,状态,开始时间,结束时间,备注。
2.创建日志表
CREATE TABLE log_table
(
source_table_name VARCHAR2(100),
target_table_name VARCHAR2(100),
php step_name VARCHAR2(100),
ROW_COUNT NUMBER,php
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;

第二次调用php存储过程时,因为emp_1134有主键,所以当第二次insert到emp_1134时检测到异常,直接抛出,不会往下走
6.日志表的功能
通过写日志表,能够记录存储过程哪一个步骤执行成功,哪一个步骤执行失败了,以及能记录 每个步骤的 执行时间,方便开发者后期对其优化,以及方便,检查。
- 日志的另一大功能点:程序报错的时候,记录程序报错的步骤 以及 错误的原因。
- 例如:存储过程的同步逻辑(比如源表有10条数据,日志表中记录,同步过去的行数有20条,说明SQL中存在数据发散)
- 练习:全量同步 DEPT 表 到 DEPT_1123,并记录详细的日志信息,以及出现异常,则抛出。
----创建目标表
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同步数php据到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.日志表总结
日志表的模板 以及 调用写日志存储过程 在项目组中已经落地好了,我们直接开发存储过程里面的同步逻辑,然后对照着套着写日志就可以了。
日志的核心功能点:
- 1.记录存储过程每个步骤的 开始时间 & 结束时间,可以分析写的SQL执行的效率高与低
- 2.记录每个步骤的执行状态,成功与否,方便我们快速找到报错的步骤
- 3.记录每个步骤的影响行数,验证程序能够准确跑出数据(如果行数为0,则说明没有跑出来数据)
- 4.记录详细的报错步骤以及错误原因,方便我们快速定位问题,解决问题
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
加载中,请稍侯......
精彩评论