ITPub博客

首页 > 数据库 > Oracle > 以半个小时为单位,滚动增加和删除表分区 一

以半个小时为单位,滚动增加和删除表分区 一

原创 Oracle 作者:1xian 时间:2009-04-23 11:14:45 0 删除 编辑
以半个小时为单位,滚动增加和删除表分区[@more@]

为了试验以周为单位滚动增加和删除表分区,特地做了一个以半个小时为单位滚动前进的实验。

要点:


1. 一天24个小时恰好可以分成48个半个小时。故不需要一个特定的时间起点。

2。 注意round 和floor的区别。

1. 创建配置表:

drop table part_retention_t cascade constraints;
--delete part_retention;

create table part_retention_t (table_name varchar2(100), tablespace_name varchar(50), retention number);

Insert into part_RETENTION (TABLE_NAME, TABLESPACE_NAME, RETENTION) Values ('TEST', 'EDATA', 60);


commit;

2. 增加和删除用的脚本:

CREATE OR REPLACE procedure add_partition_t
as

CURSOR c_td_table IS SELECT table_name, tablespace_name FROM part_retention_t;


v_partition VARCHAR2 (30);
sql_stmt_err VARCHAR2 (4000);

v_half number;
v_which number;
v_this_half date;

v_pre_part number := 0;

v_turnaround number := 13;

sql_stmt VARCHAR2 (1000); -- String used to save sql statement
err_msg VARCHAR2 (300);


BEGIN

select mod(to_number(to_char(sysdate, 'HH')) * 2 + decode((floor(to_number(to_char(sysdate, 'MI')) / 30 )), 0,0,1,1), 13) into v_half from dual;

select decode((round(to_number(to_char(sysdate, 'MI')) / 30 , 0)), 0,0,1) into v_which from dual;

select trunc(sysdate, 'HH') + (1 / 24 / 2 ) * (3 + decode((floor(to_number(to_char(sysdate, 'MI')) / 30 )), 0,1,1,2,1)) into v_this_half from dual;


--select mod(round((trunc(sysdate ) - trunc(to_date('2000-01-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))) / 7, 0), v_turnaround) into v_week from dual;




FOR v_table IN c_td_table
LOOP

BEGIN

begin
select 1 into v_pre_part from user_tab_partitions where table_name = v_table.table_name AND partition_name = 'P' || v_half;
dbms_output.put_line('v_pre_part is:: ' || v_pre_part);
if (v_pre_part is not null) then
sql_stmt := 'alter table ' || v_table.table_name || ' drop partition ' || 'P' || v_half;
dbms_output.put_line('drop stmt is:: ' || sql_stmt);
execute immediate sql_stmt;

end if;
exception when others then
dbms_output.put_line(substr(SQLERRM, 1, 255));
null;
end;

sql_stmt := 'ALTER TABLE '|| v_table.table_name || ' ADD PARTITION ' || 'P' || v_half || ' VALUES LESS THAN ( to_date ( ''' || to_char(v_this_half, 'yyyy-mm-dd hh24:mi:ss' ) || ''',''yyyy-mm-dd hh24:mi:ss'')) ' || 'tablespace ' || v_table.tablespace_name || v_half;

begin
dbms_output.put_line(sql_stmt);
execute immediate sql_stmt;
exception when others then null;
end;

END;
END LOOP;

END;
/

3. 添加job用的脚本:

CREATE OR REPLACE procedure add_sunday_job_t is

v_sunday date;
v_job BINARY_INTEGER;
v_what VARCHAR2(200);
v_date date;
begin

select trunc(sysdate, 'HH') + (1 / 24 / 2 ) * decode((round(to_number(to_char(sysdate, 'MI')) / 30 , 0)), 0,1,2,2,1) into v_date from dual;

v_what := 'begin add_partition_t; end;';
begin
select job into v_job from user_jobs where what = v_what;
DBMS_JOB.REMOVE(v_job);
EXCEPTION
WHEN OTHERS THEN NULL;
end;

DBMS_JOB.SUBMIT (
job => v_job
,what => v_what
,next_date => v_date - 1 / 24 / 30
,interval => 'SYSDATE + 1/24/2');
COMMIT;
end;
/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21342557/viewspace-1021125/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-15

  • 博文量
    13
  • 访问量
    15890