Oracle10g中,创建范围分区表时,通常建议创建指定maxvalue值的分区,以避免由于插入值超出分区最大值范围而导致ora-14400错误的发生。
SQL> create table sales_normal
( sales_id number,
sales_dt date)
partition by range (sales_dt)
( partition p200901 values less than (to_date(‘2009-2-1′,’yyyy-mm-dd’)));Table created.
SQL> insert into sales_normal values(1,’1-dec-09′);
insert into sales_normal values(1,’1-dec-09′)
*
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partitionSQL> alter table sales_normal
2 add partition p_max values less than (maxvalue);Table altered.
SQL> insert into sales_normal values(1,’1-dec-09′);
1 row created.
SQL> commit;
Commit complete.
Oracle11g中一种新的分区类型很好的解决了这个问题–interval partition,它是传统范围分区的扩展,使得分区表的使用和维护更加灵活。
SQL> create table sales
( sales_id number,
sales_dt date)
partition by range(sales_dt)
interval (numtoyminterval (1,’month’))
( partition p200901 values less than (to_date(‘2009-2-1′,’yyyy-mm-dd’)));Table created.
SQL> insert into sales values(1,’01-dec-09′);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from sales;
SALES_ID SALES_DT
———- ———
1 01-DEC-09
可以看出,虽然2009-12-1超出分区最大值2009-2-1的范围,插入操作并没有报错。那么对于这种数据,Oracle是怎么处理的呢?我们看看user_tab_partitoins视图就知道其中的奥秘。
SQL> select partition_name,high_value from user_tab_partitions
2 where table_name=’SALES’;PARTITION_ HIGH_VALUE
———- ——————————————————————————–
P200901 TO_DATE(‘ 2009-02-01 00:00:00′, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIA
SYS_P21 TO_DATE(‘ 2010-01-01 00:00:00′, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIA
当插入的数值超出表分区范围的最大值时,系统动态创建能够满足插入值的表分区,保存插入的数据。这里的SYS_P21就是Oracle系统自动产生,分区的最大值为2010-01-01。