9人参与 • 2025-06-09 • Oracle
日志一般会记录:同步的源表名,同步的目标表名,步骤名称,记录行数,状态,开始时间,结束时间,备注。
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) );
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;
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;
将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时检测到异常,直接抛出,不会往下走
通过写日志表,能够记录存储过程哪一个步骤执行成功,哪一个步骤执行失败了,以及能记录 每个步骤的 执行时间,方便开发者后期对其优化,以及方便,检查。
----创建目标表 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;
日志表的模板 以及 调用写日志存储过程 在项目组中已经落地好了,我们直接开发存储过程里面的同步逻辑,然后对照着套着写日志就可以了。
日志的核心功能点:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论