創建分區表
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 特定格式的分區命名才可以自動創建