创建分区表
create table pdba (id number, ctime date) partition by range (ctime) ( partition PD_201303 values less than (to_date('2013-04-1', 'yyyy-mm-dd')), partition PD_201304 values less than (to_date('2013-05-1', 'yyyy-mm-dd')), partition PD_201305 values less than (to_date('2013-06-1', 'yyyy-mm-dd')) );
增加分区表
alter table pdba add partition PD_201306 values less than (to_date('2013-07-01', 'yyyy-mm-dd'));
自动增加分区表存储过程
create or replace procedure timer_auto_add_newpartitions as cursor c_parts is select table_name,max(partition_name) as part_name from user_tab_partitions group by table_name; v_tname varchar2(32); v_pname varchar2(32); v_sql varchar2(3999); v_mcurr varchar2(32); v_npart varchar2(32); v_tmp varchar2(32); --v_key varchar2(32); v_newp date; begin for i in c_parts loop dbms_output.put_line('v_tname:'); dbms_output.put_line('v_pname:'); v_tname := i.table_name; v_pname := i.part_name; dbms_output.put_line(v_tname); dbms_output.put_line(v_pname); --select column_name into v_key from user_part_key_columns where name = v_tname; v_mcurr := to_char(sysdate,'yyyymm'); v_npart := substr(v_pname,instr(v_pname,'_')+1);--instr判断下横杠位置然后+1交给substr截取当前分区名称中的年月 --调试过程可以通过dbms_output.put_line显示变量 --dbms_output.put_line需要打开set serveroutput on才能看到结果 --dbms_output.put_line('v_mount_current:'); --dbms_output.put_line(v_mcurr); --dbms_output.put_line('v_npart:'); --dbms_output.put_line(v_npart); if v_mcurr = v_npart then --如果当前月份等于分区中截取出来的月份则开始自动创建下月分区操作 v_npart := to_char(add_months(to_date(v_npart,'yyyymm'),1),'yyyymm');--生成下月年月 v_newp := add_months(to_date(v_npart,'yyyymm'),1);--生成下月年月 v_pname := substr(v_pname,1,instr(v_pname,'_'))||v_npart;--构造新分区表名称 v_sql := 'alter table '||v_tname||' add partition '||v_pname||' values less than ('||'to_date('''||to_char(v_newp,'yyyy-mm-dd hh24:mi:ss')||''''||','''||'yyyy-mm-dd hh24:mi:ss'||''')'||')'; dbms_output.put_line(v_sql); execute immediate v_sql; end if; end loop; end;
然后配合jobs每月月尾自动执行
另外注意,此脚本只适合于 XXX_201305 特定格式的分区命名才可以自动创建