--在表比较多而大的数据仓库环境中,空间有时会比较珍贵,所以oracle采用压缩技术节省空间,下面是存储过程。
-- 如果谁有兴趣可以联系我,我把相关的脚本都给他QQ:360263676
create or replace procedure pr_exec_compress_cfg1(stat_date in varchar2,oi_return out number)
/** HEAD
* @name sys.pr_exec_compress_cfg
* @caption 压缩表存储过程
* @type
* @parameter cycle_date in varchar2 统计日期
* @parameter oi_return out number 执行状态码,整数,0 正常,-1 出错
* @description 压缩表存储过程
* @target sys.exec_compress_cfg
* @source etl.tb_main_compress_cfg
* @middle
* @version 1.0
* @author
* @create-date 2010-08-03
* @TODO 无
* @version
* @mender
* @modify_date
* @modify_desc
* @copyright
*/
-- ********************************************************************************
-- 程序名称: sys.pr_exec_compress_cfg
-- 功能描述: o压缩表存储过程
-- 输入参数: stat_date - 统计日期
-- 输出参数: oi_return - 执行状态码,整数,0 正常,-1 出错
-- 输入资源: tb_main_compress_cfg
-- 输出资源: sys#exec_compress_cfg
-- 中间资源:
-- 创建人员: tux
-- 创建日期: 2010-09-07
-- 版本说明: v1.0
-- 修改人员: tux
-- 修改日期: 2010-09-07
-- 修改原因: 增加去月数据的压缩功能每月的15号对月表进行压缩
-- 版本说明: v1.1
-- 公司名称: www.tuxuniontech.com
-- ********************************************************************************
is
vs_task_name varchar2(30); -- 任务名称
vs_table_name varchar2(30); -- 表名称
vs_message varchar2(200); -- 日志信息
vi_task_id integer; -- 日志id
vs_date varchar2(8); -- 统计日期
vs_month varchar2(6); -- 统计月份
vs_mid_day varchar2(8);
begin
vs_task_name := 'pr_exec_compress_cfg1';
vs_table_name := 'pr_exec_compress_cfg1';
vs_date := substr(stat_date,1,8);
vs_month := substr(stat_date,1,6);
vs_mid_day := substr(stat_date,1,6)||'15';
-- 程序开始日志
sys.ps_log(vs_task_name, vs_table_name, vs_date, 1, null, vi_task_id);
-- 出错: 没有输入统计日期参数
-- 判断输入表名
-- 清空临时表
execute immediate 'truncate table sys.tr_exec_compress_cfg' ;
insert into sys.tr_exec_compress_cfg
select 'alter table ' || t.table_owner || '.' || t.table_name ||
' move partition ' || t.partition_name || ' tablespace ' ||
t.tablespace_name || ' compress parallel 8'
from all_tab_partitions t,
etl.tb_main_compress_cfg t1
where t.table_owner = upper(t1.table_owner)
and t.table_name = upper(t1.table_name)
and t1.stor_type = 'D'
and t.partition_name like '%' || vs_date || '%'
order by t.partition_name
;
commit;
-- 判断是否为月中并对月数据进行压缩
if vs_date = vs_mid_day then
insert into sys.tr_exec_compress_cfg
select 'alter table ' || t.table_owner || '.' || t.table_name ||
' move partition ' || t.partition_name || ' tablespace ' ||
t.tablespace_name || ' compress parallel 8'
from all_tab_partitions t,
etl.tb_main_compress_cfg t1
where t.table_owner = upper(t1.table_owner)
and t.table_name = upper(t1.table_name)
and t1.stor_type = 'M'
and t.partition_name like '%' || vs_month || '%'
order by t.partition_name
;
commit;
end if;
--- 对表进行压缩
for compress_sql in
(
select exe_sql
from sys.tr_exec_compress_cfg
)
loop
execute immediate compress_sql.exe_sql ;
end loop
;
commit;
------------------------------------------------------------
-- 程序结束日志
sys.ps_log(null, null, null, 2, null, vi_task_id);
oi_return := 0;
-- 成功返回
exception
when others then
-- 得到出错信息
vs_message := substr(sqlerrm, 1, 200);
-- 回滚事务
rollback;
-- 程序出错日志
sys.ps_log(null, null, null, 3, vs_message, vi_task_id);
oi_return := -1;
-- 出错返回
return;
end;