前段时间做了个分区功能,表结构如下:
-- Create table create table SUM_DUTY ( oid VARCHAR2(36) default sys_guid() not null, entry_id VARCHAR2(18) not null, manual_no VARCHAR2(12), p_date DATE, i_e_flag VARCHAR2(1), traf_mode VARCHAR2(1), trade_code VARCHAR2(10), trade_name VARCHAR2(255), trade_mode VARCHAR2(4), cut_mode VARCHAR2(3), tax_type VARCHAR2(1), real_tax NUMBER(19,2), center_code VARCHAR2(4), center_name VARCHAR2(255), scene_code VARCHAR2(4), scene_name VARCHAR2(255), manual_type VARCHAR2(4), inserttime DATE default SYSDATE ) partition by range (P_DATE) subpartition by list (MANUAL_TYPE) ( partition SUM_DUTY_2014_01 values less than (TO_DATE(‘ 2014-01-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_01_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_01_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_01_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_01_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_01_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_01_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_01_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_02 values less than (TO_DATE(‘ 2014-02-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_02_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_02_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_02_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_02_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_02_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_02_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_02_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_03 values less than (TO_DATE(‘ 2014-03-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_03_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_03_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_03_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_03_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_03_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_03_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_03_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_04 values less than (TO_DATE(‘ 2014-04-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_04_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_04_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_04_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_04_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_04_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_04_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_04_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_05 values less than (TO_DATE(‘ 2014-05-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_05_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_05_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_05_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_05_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_05_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_05_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_05_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_06 values less than (TO_DATE(‘ 2014-06-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_06_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_06_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_06_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_06_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_06_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_06_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_06_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_07 values less than (TO_DATE(‘ 2014-07-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_07_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_07_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_07_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_07_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_07_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_07_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_07_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_08 values less than (TO_DATE(‘ 2014-08-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_08_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_08_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_08_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_08_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_08_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_08_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_08_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_09 values less than (TO_DATE(‘ 2014-09-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_09_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_09_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_09_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_09_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_09_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_09_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_09_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_10 values less than (TO_DATE(‘ 2014-10-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_10_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_10_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_10_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_10_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_10_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_10_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_10_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_11 values less than (TO_DATE(‘ 2014-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_11_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_11_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_11_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_11_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_11_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_11_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_11_MANUAL_F values (DEFAULT) ), partition SUM_DUTY_2014_12 values less than (TO_DATE(‘ 2014-12-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘)) ( subpartition SUM_DUTY_2014_12_MANUAL_B values (‘B23‘), subpartition SUM_DUTY_2014_12_MANUAL_C values (‘C23‘), subpartition SUM_DUTY_2014_12_MANUAL_E values (‘E23‘), subpartition SUM_DUTY_2014_12_MANUAL_H values (‘H23‘), subpartition SUM_DUTY_2014_12_MANUAL_L values (‘L23‘), subpartition SUM_DUTY_2014_12_MANUAL_K values (‘K23‘), subpartition SUM_DUTY_2014_12_MANUAL_F values (DEFAULT) ) );
后要求以后当年自动新建下一年分区:
create or replace procedure SP_AutoCreatePartition is /*自动新建系统中所有分区表的下一年的分区*/ /*过程中涉及DBA_TAB_PARTITIONS的访问,必须给用当前用户select权限:grant select on DBA_TAB_PARTITIONS to 用户*/ V_COUNT NUMBER; --用于判断是否已存在分区 V_USERNAME VARCHAR2(100); --当前用户 V_DATE_STR VARCHAR2(100); --下一年年份 X NUMBER; --一年十二个月 V_PARTITION_DATE VARCHAR2(100);--分区的日期格式 V_DATA_STRING VARCHAR2(100); --分区值年月 V_SQL VARCHAR2(4000); begin SELECT USER INTO V_USERNAME FROM DUAL;--获取当前用户 SELECT TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE,12),‘YYYY‘),‘YYYY‘) INTO V_DATE_STR FROM DUAL;--获取下一年的年份 SELECT COUNT(1) INTO V_COUNT FROM DBA_TAB_PARTITIONS T WHERE T.TABLE_NAME=‘SUM_DUTY‘ AND INSTR(T.PARTITION_NAME,V_DATE_STR)>0 AND T.TABLE_OWNER=V_USERNAME;--计算当前表中是否已存在下一年的分区 IF V_COUNT=0 THEN x := 1; WHILE x <=12 LOOP SELECT TO_CHAR(ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,12),‘YYYY‘),x-1),‘YYYY_MM‘) INTO V_PARTITION_DATE FROM DUAL; SELECT TO_CHAR(ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,12),‘YYYY‘),x-1),‘YYYY-MM‘) INTO V_DATA_STRING FROM DUAL; V_SQL:=‘ALTER TABLE SUM_DUTY ADD partition SUM_DUTY_‘||V_PARTITION_DATE||‘ values less than (TO_DATE(‘‘‘||V_DATA_STRING||‘-01 00:00:00‘‘, ‘‘SYYYY-MM-DD HH24:MI:SS‘‘, ‘‘NLS_CALENDAR=GREGORIAN‘‘)) ( subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_B values (‘‘B23‘‘), subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_C values (‘‘C23‘‘), subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_E values (‘‘E23‘‘), subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_H values (‘‘H23‘‘), subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_L values (‘‘L23‘‘), subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_K values (‘‘K23‘‘), subpartition SUM_DUTY_‘||V_PARTITION_DATE||‘_MANUAL_F values (DEFAULT) )‘; EXECUTE IMMEDIATE V_SQL; x := x + 1; END LOOP; END IF; end SP_AutoCreatePartition;
时间: 2024-09-30 00:18:35