范围分区表和INTERVAL分区表是可以相互转化的,不过二者还是有所区别的。比如在SPLIT分区的时候,范围分区表没有限制,而INTERVAL分区表则可能报错。


首先看范围分区的例子:


SQL> CREATE TABLE T_PART_RANGE


 2  (ID NUMBER,


 3  NAME VARCHAR2(30),


 4  CREATE_DATE DATE)


 5  PARTITION BY RANGE (CREATE_DATE)


 6  (PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')),


 7  PARTITION P2 VALUES LESS THAN (TO_DATE('2009-5', 'YYYY-MM')),


 8  PARTITION P3 VALUES LESS THAN (TO_DATE('2009-9', 'YYYY-MM')));


表已创建。


SQL> ALTER TABLE T_PART_RANGE


 2  SPLIT PARTITION P3


 3  AT (TO_DATE('2009-7-30', 'YYYY-MM-DD'))


 4  INTO (PARTITION P3, PARTITION P4);


表已更改。


SQL> SELECT PARTITION_NAME, HIGH_VALUE


 2  FROM USER_TAB_PARTITIONS


 3  WHERE TABLE_NAME = 'T_PART_RANGE'


 4  ORDER BY 1;


PARTITION_NAME HIGH_VALUE


-------------- ----------------------------------------------------------------------------------


P1             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


P2             TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


P3             TO_DATE(' 2009-07-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


P4             TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


同样的操作,在INTERVAL分区表上执行就会报错:


SQL> CREATE TABLE T_PART_INTER


 2  (ID NUMBER,


 3  NAME VARCHAR2(30),


 4  CREATE_DATE DATE)


 5  PARTITION BY RANGE (CREATE_DATE)


 6  INTERVAL (INTERVAL '4' MONTH)


 7  (PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')),


 8  PARTITION P2 VALUES LESS THAN (TO_DATE('2009-5', 'YYYY-MM')));


表已创建。


SQL> INSERT INTO T_PART_INTER


 2  VALUES (1, 'TEST', TO_DATE('2009-8', 'YYYY-MM'));


已创建1行。


SQL> COMMIT;


提交完成。


SQL> SELECT PARTITION_NAME, HIGH_VALUE


 2  FROM USER_TAB_PARTITIONS


 3  WHERE TABLE_NAME = 'T_PART_INTER'


 4  ORDER BY 1;


PARTITION_NAME HIGH_VALUE


-------------- ----------------------------------------------------------------------------------


P1             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


P2             TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


SYS_P96        TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


SQL> ALTER TABLE T_PART_RANGE


 2  SPLIT PARTITION FOR(TO_DATE('2009-8', 'YYYY-MM'))


 3  AT (TO_DATE('2009-7-30', 'YYYY-MM-DD'))


 4  INTO (PARTITION P3, PARTITION P4);


ALTER TABLE T_PART_RANGE


*


第1行出现错误:


ORA-14080:无法按指定的上限来分割分区


显然导致问题的原因是由于SPLIT分区操作后,INTERVAL分区会根据SPLIT的日期作为基准时间,在此基础上进行INTERVAL递增,因此大于28日的日志使用INTERVAL则会导致在2月的时候出错,所以Oracle禁止大于28日的日期作为INTERVAL MONTH的基础分区。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html