前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle 分区表的 FOR 语句,你这样用过吗?

Oracle 分区表的 FOR 语句,你这样用过吗?

作者头像
数据和云
发布2020-02-25 10:54:10
6490
发布2020-02-25 10:54:10
举报
文章被收录于专栏:数据和云

在11g以后,Oracle简化了指定分区的方式,不再需要明确指定分区名称,而是可以通过指定分区键值列数据的方式来指向对应的分区。

指定一个分区除了使用分区名称外,很多时候还可以使用FOR语句。 从11g开始,对分区进行操作的时候,不仅可以使用分区名称,还可以使用FOR语句。 在10g中,MERGE RANGE分区的语句如下:

代码语言:javascript
复制
表已创建。

而在11g中,除了使用分区名称外,还可以使用FOR语句来代替,比如:

代码语言:javascript
复制
表已创建。

这种语法的优势对于范围分区还不是很明显,而对于INTERVAL分区就十分有意义了。由于INTERVAL分区的分区名称是系统产生的,用户对INTERVAL分区最直观的莫过于存在分区中的数据的范围,根据分区的定义和INTERVAL的设置很容易可以确定分区的范围和其中的数据,但是分区的名称就必须通过数据字典才能查询得到。

一个INTERVAL分区的简单的例子:

代码语言:javascript
复制
表已创建。

继续上面的例子:

代码语言:javascript
复制
表已创建。

下面打算通过FOR语句的方式合并P2和P3分区:

代码语言:javascript
复制
第 1 行出现错误:

根据错误文档的描述,感觉是分区键值指定出现了错误,查询分区信息:

代码语言:javascript
复制
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')

难道是分区键值指定有问题:

代码语言:javascript
复制
完全仿照USER_TAB_PARTITIONS视图中的分区定义,错误依旧。

最终发现了问题所在,FOR语句中指定的并不是分区定义时使用的值,而是存储在当前分区中的值:

代码语言:javascript
复制
表已更改。

因此Oracle并非根据分区定义来判断分区,而是根据用户给出的值,来判断所属分区,所以,P1分区和SYS_P78分区的合并完全可以写成:

代码语言:javascript
复制
表已更改。

由于FOR语句的这种特性,使得HASH分区也可以使用这个特性:

代码语言:javascript
复制
表已创建。

这个例子对包含ID为6的分区进行了MOVE操作,而且甚至不需要指定的ID存在。

最后给一个简单的LIST分区的SPLIT的例子:

代码语言:javascript
复制
表已创建。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档