编写得目的:
1 在数据迁移中,日常数据清洗是一个很频繁得工作。如果每次通过sql分步执行会非常麻烦及耗时。
所以通过自动统计执行的方式处理减少不必要的重复并且简单的工作量
2 在大量的任务及着急催促下 减少出错的概率
3 所以统计信息同步数据库存储 从而 信息共享 方便工作使用 如 在家远程 等等的,同事协助处理,会简单并且
方便很多
第一 我们创建一张RS_STATISTICS表 存储我们的统计信息及统计脚本
第二 根据我们的RS_STATISTICS 的内容 通过存储过程去 执行我们要统计的脚本
在这里只需要使用到 动态执行 即可
/*
create table RS_STATISTICS
(
rs_id VARCHAR2(50),
rs_type VARCHAR2(50),
rs_name VARCHAR2(50),
rs_content VARCHAR2(4000),
rs_table VARCHAR2(50),
rs_num NUMBER,
op_tm DATE default sysdate not null,
rs_sts NUMBER default 0 not null,
ct DATE,
ut DATE,
memo VARCHAR2(3000),
rs_exception VARCHAR2(3000)
)
tablespace SYNCSH_DAT
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column RS_STATISTICS.rs_id
is 'ID';
comment on column RS_STATISTICS.rs_type
is '类型';
comment on column RS_STATISTICS.rs_name
is '名称';
comment on column RS_STATISTICS.rs_content
is '内容';
comment on column RS_STATISTICS.rs_table
is '表';
comment on column RS_STATISTICS.rs_num
is '数量';
comment on column RS_STATISTICS.op_tm
is '录入时间';
comment on column RS_STATISTICS.ct
is '开始时间';
comment on column RS_STATISTICS.ut
is '更新时间';
comment on column RS_STATISTICS.memo
is '备注';
comment on column RS_STATISTICS.rs_sts
is '状态 0 待执行,1 执行中,2 执行成功,4 异常';
*/
create or replace package p_rs_statistics is
--// 程序启动
procedure p_start;
--// 初始化 数据存储表
procedure p_Complement;
--// 程序处理
procedure perform(p_id varchar2);
--// 清空落地表数据
procedure truncate_str(rs_table varchar2);
--// drop 表
procedure drop_str(rs_table varchar2);
end p_rs_statistics;
/
create or replace package body p_rs_statistics is
procedure p_start is
begin
for x in (select d.rs_id from syncsh.rs_statistics d where d.rs_sts = 0) loop
update syncsh.rs_statistics d
set d.rs_sts = 1, d.rs_exception = null, d.rs_num = 0,ct=sysdate
where d.rs_id = x.rs_id;
commit;
perform(x.rs_id);
end loop;
exception
when others then
rollback;
end;
procedure p_Complement is
v_rs_statistics syncsh.rs_statistics%rowtype;
begin
update syncsh.rs_statistics d
set d.rs_table = 'syncsh.rs_statistics_' || d.rs_id
where 1 = 1;
commit;
procedure perform(p_id varchar2) is
v_rs_statistics syncsh.rs_statistics%rowtype;
exec_str varchar2(4000);
p_sqlerrm varchar2(4000);
select *
into v_rs_statistics
from syncsh.rs_statistics d
where d.rs_id = p_id;
---> 清空表
p_rs_statistics.truncate_str(v_rs_statistics.rs_table);
---> 删除表
p_rs_statistics.drop_str(v_rs_statistics.rs_table);
---> 创建 录入数据
exec_str := 'create table ' || v_rs_statistics.rs_table || ' as ' ||
v_rs_statistics.rs_content;
execute immediate exec_str;
v_rs_statistics.rs_num := sql%rowcount;
dbms_output.put_line('rs_num :' || v_rs_statistics.rs_num);
--> 更新状态
update syncsh.rs_statistics d
set d.rs_num = v_rs_statistics.rs_num, d.rs_sts = 2, d.ut = sysdate
where d.rs_id = p_id;
commit;
when others then
p_sqlerrm := substr(sqlerrm, 1, 500);
dbms_output.put_line('exec_str : ' || exec_str);
dbms_output.put_line('ID :' || p_id || ' 异常 : ' || p_sqlerrm);
--> 记录异常
update syncsh.rs_statistics d
set d.rs_exception = p_sqlerrm, d.rs_sts = 4, d.ut = sysdate
where d.rs_id = p_id;
commit;
procedure truncate_str(rs_table varchar2) is
truncate_str varchar2(4000);
p_sqlerrm varchar2(4000);
truncate_str := 'truncate table ' || rs_table;
execute immediate truncate_str;
when others then
p_sqlerrm := substr(sqlerrm, 1, 500);
dbms_output.put_line('truncate rs_table :' || rs_table || ' 异常 : ' ||
p_sqlerrm);
procedure drop_str(rs_table varchar2) is
drop_str varchar2(4000);
p_sqlerrm varchar2(4000);
drop_str := 'drop table ' || rs_table;
execute immediate drop_str;
commit;
when others then
p_sqlerrm := substr(sqlerrm, 1, 500);
dbms_output.put_line('drop rs_table :' || rs_table || ' 异常 : ' ||
p_sqlerrm);
软件程序 脚本是为了提供方便而产生。愿可以减少不必要的时间浪费。
如 小伙伴提供一份 程序 导出execl 的最好了 感谢!
*/