在11g以后,Oracle简化了指定分区的方式,不再需要明确指定分区名称,而是可以通过指定分区键值列数据的方式来指向对应的分区。
指定一个分区除了使用分区名称外,很多时候还可以使用FOR语句。 从11g开始,对分区进行操作的时候,不仅可以使用分区名称,还可以使用FOR语句。 在10g中,MERGE RANGE分区的语句如下:
表已创建。
而在11g中,除了使用分区名称外,还可以使用FOR语句来代替,比如:
表已创建。
这种语法的优势对于范围分区还不是很明显,而对于INTERVAL分区就十分有意义了。由于INTERVAL分区的分区名称是系统产生的,用户对INTERVAL分区最直观的莫过于存在分区中的数据的范围,根据分区的定义和INTERVAL的设置很容易可以确定分区的范围和其中的数据,但是分区的名称就必须通过数据字典才能查询得到。
一个INTERVAL分区的简单的例子:
表已创建。
继续上面的例子:
表已创建。
下面打算通过FOR语句的方式合并P2和P3分区:
第 1 行出现错误:
根据错误文档的描述,感觉是分区键值指定出现了错误,查询分区信息:
SQL> SELECT PARTITION_NAME, HIGH_VALUE
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'T_PART_RANGE'
ORDER BY ;
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-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P3 TO_DATE(' 2009-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
难道是分区键值指定有问题:
完全仿照USER_TAB_PARTITIONS视图中的分区定义,错误依旧。
最终发现了问题所在,FOR语句中指定的并不是分区定义时使用的值,而是存储在当前分区中的值:
表已更改。
因此Oracle并非根据分区定义来判断分区,而是根据用户给出的值,来判断所属分区,所以,P1分区和SYS_P78分区的合并完全可以写成:
表已更改。
由于FOR语句的这种特性,使得HASH分区也可以使用这个特性:
表已创建。
这个例子对包含ID为6的分区进行了MOVE操作,而且甚至不需要指定的ID存在。
最后给一个简单的LIST分区的SPLIT的例子:
表已创建。