定时删除虚拟列分区
2015-01-15 23:15
295 查看
这是我的测试过程:
其中的表、存储过程、job等都需要根据生产环境进行修改
drop table vtest purge;
create table vtest (
day1 date,
day2 char(8),
fqkey date generated always as (to_date(day2,'YYYYMMDD')))
partition by range(fqkey)
interval (numtodsinterval(1,'day'))
(partition p20120115 values less than (to_date('20120115','YYYYMMDD')));
insert into vtest(day1,day2) values(sysdate-31,'20140101');
insert into vtest(day1,day2) values(sysdate-30,'20140102');
insert into vtest(day1,day2) values(sysdate-29,'20140103');
insert into vtest(day1,day2) values(sysdate-28,'20140104');
insert into vtest(day1,day2) values(sysdate-27,'20140105');
insert into vtest(day1,day2) values(sysdate-26,'20140106');
insert into vtest(day1,day2) values(sysdate-25,'20140107');
insert into vtest(day1,day2) values(sysdate-24,'20140108');
insert into vtest(day1,day2) values(sysdate-23,'20150109');
insert into vtest(day1,day2) values(sysdate-22,'20150110');
insert into vtest(day1,day2) values(sysdate-21,'20150121');
insert into vtest(day1,day2) values(sysdate-19,'20150111');
insert into vtest(day1,day2) values(sysdate-18,'20160131');
insert into vtest(day1,day2) values(sysdate-17,'20160112');
insert into vtest(day1,day2) values(sysdate-16,'20160113');
insert into vtest(day1,day2) values(sysdate-15,'20160114');
insert into vtest(day1,day2) values(sysdate-14,'20160115');
commit;
select segment_name,owner,segment_type,partition_name from dba_segments where segment_name='VTEST';
select * from vtest;
create or replace procedure lcltest is
v_sql varchar2(400);
v_table_name user_tab_partitions.table_name%type;
v_partition_name user_tab_partitions.partition_name%type;
v_high_value varchar(200);
v_tmp_partition_name user_tab_partitions.partition_name%type;
cursor cur is
select
table_name ,
partition_name ,
high_value
from user_tab_partitions
where partition_name like 'SYS%' ;
begin
open cur;
loop
fetch cur into v_table_name,v_partition_name,v_high_value;
exit when cur%notfound;
v_tmp_partition_name := substr(v_high_value,11,10);
v_tmp_partition_name := to_char( to_date(v_tmp_partition_name,'yyyy-mm-dd')-1 , 'yyyymmdd');
dbms_output.put_line( v_tmp_partition_name );
if to_char(sysdate,'yyyymmdd')-v_tmp_partition_name > 7 then
--dbms_output.put_line( 'AAAAAA' );
v_sql := 'alter table '||v_table_name||' drop partition '
||v_partition_name;
dbms_output.put_line( v_sql );
execute immediate v_sql;
end if;
end loop;
close cur;
end lcltest;
begin
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'proc_drop_vtest_partition',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN call lcl.lcltest; END;',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
auto_drop => false,
enabled => true,
comments => 'My new job : to drop vtest partitions which are created a week ago');
end;
/
再次插入,进行测试
其中的表、存储过程、job等都需要根据生产环境进行修改
drop table vtest purge;
create table vtest (
day1 date,
day2 char(8),
fqkey date generated always as (to_date(day2,'YYYYMMDD')))
partition by range(fqkey)
interval (numtodsinterval(1,'day'))
(partition p20120115 values less than (to_date('20120115','YYYYMMDD')));
insert into vtest(day1,day2) values(sysdate-31,'20140101');
insert into vtest(day1,day2) values(sysdate-30,'20140102');
insert into vtest(day1,day2) values(sysdate-29,'20140103');
insert into vtest(day1,day2) values(sysdate-28,'20140104');
insert into vtest(day1,day2) values(sysdate-27,'20140105');
insert into vtest(day1,day2) values(sysdate-26,'20140106');
insert into vtest(day1,day2) values(sysdate-25,'20140107');
insert into vtest(day1,day2) values(sysdate-24,'20140108');
insert into vtest(day1,day2) values(sysdate-23,'20150109');
insert into vtest(day1,day2) values(sysdate-22,'20150110');
insert into vtest(day1,day2) values(sysdate-21,'20150121');
insert into vtest(day1,day2) values(sysdate-19,'20150111');
insert into vtest(day1,day2) values(sysdate-18,'20160131');
insert into vtest(day1,day2) values(sysdate-17,'20160112');
insert into vtest(day1,day2) values(sysdate-16,'20160113');
insert into vtest(day1,day2) values(sysdate-15,'20160114');
insert into vtest(day1,day2) values(sysdate-14,'20160115');
commit;
select segment_name,owner,segment_type,partition_name from dba_segments where segment_name='VTEST';
select * from vtest;
create or replace procedure lcltest is
v_sql varchar2(400);
v_table_name user_tab_partitions.table_name%type;
v_partition_name user_tab_partitions.partition_name%type;
v_high_value varchar(200);
v_tmp_partition_name user_tab_partitions.partition_name%type;
cursor cur is
select
table_name ,
partition_name ,
high_value
from user_tab_partitions
where partition_name like 'SYS%' ;
begin
open cur;
loop
fetch cur into v_table_name,v_partition_name,v_high_value;
exit when cur%notfound;
v_tmp_partition_name := substr(v_high_value,11,10);
v_tmp_partition_name := to_char( to_date(v_tmp_partition_name,'yyyy-mm-dd')-1 , 'yyyymmdd');
dbms_output.put_line( v_tmp_partition_name );
if to_char(sysdate,'yyyymmdd')-v_tmp_partition_name > 7 then
--dbms_output.put_line( 'AAAAAA' );
v_sql := 'alter table '||v_table_name||' drop partition '
||v_partition_name;
dbms_output.put_line( v_sql );
execute immediate v_sql;
end if;
end loop;
close cur;
end lcltest;
begin
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'proc_drop_vtest_partition',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN call lcl.lcltest; END;',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
auto_drop => false,
enabled => true,
comments => 'My new job : to drop vtest partitions which are created a week ago');
end;
/
再次插入,进行测试
相关文章推荐
- 让linux每天定时备份MySQL数据库并删除五天前的备份文件
- 任务调度开源框架Quartz动态添加、修改和删除定时任务
- hibernate定时删除日志信息调用的方法
- sql中睡眠的进程定时删除的方法
- 定时删除归档日志shell
- linux中定时备份数据库和定时删除(含压缩)
- Windows 定时删除指定路径下N天前的日志文件
- linux_crontab_定时删除
- linux实现crontab定时任务计划并删除之前的文件备份
- spring定时把服务器中的文件传输到ftp服务器上并且删除服务器中传输后的文件
- linux 机器定时删除指定目录的过期日志
- linux定时备份MySQL数据库并删除七天前的备份文件
- Spring3整合Quartz2实现定时任务及动态任务调整(添加删除暂停恢复)--推荐
- Quartz2定时任务动态 重新安排 ,暂停 ,恢复,重启 , 删除 ,重新添加
- oracle定时添加或删除分区表的分区
- java监听器定时删除服务器上的文件
- spring+quartz新增,删除,暂停,恢复定时任务
- Linux下定时删除过期文件的方法
- MySQL 定时删除数据
- Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务