范围分区表和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的基础分区。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。