INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表。



对于一个普通的范围分区表:


SQL> CREATE TABLE T_PART


 2  (ID NUMBER,


 3  NAME VARCHAR2(30),


 4  CREATE_DATE DATE)


 5  PARTITION BY RANGE (ID)


 6  (PARTITION P1 VALUES LESS THAN (100),


 7  PARTITION P2 VALUES LESS THAN (200),


 8  PARTITION P3 VALUES LESS THAN (300));


表已创建。


SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL


 2  FROM USER_PART_TABLES


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME                     PARTITION INTERVAL


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


T_PART                         RANGE


SQL> INSERT INTO T_PART


 2  VALUES (100, 'A', SYSDATE);


已创建1行。


SQL> INSERT INTO T_PART


 2  VALUES (240, 'A', SYSDATE);


已创建1行。


SQL> INSERT INTO T_PART


 2  VALUES (360, 'TEST', SYSDATE);


INSERT INTO T_PART


           *


第1行出现错误:


ORA-14400:插入的分区关键字未映射到任何分区


插入超过分区上限的记录会报错,下面通过一个简单ALTER TABLE语句,将RANGE分区表转化为INTERVAL分区表:


SQL> ALTER TABLE T_PART SET INTERVAL (100);


表已更改。


SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL


 2  FROM USER_PART_TABLES


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME                     PARTITION INTERVAL


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


T_PART                         RANGE     100


SQL> INSERT INTO T_PART


 2  VALUES (360, 'TEST', SYSDATE);


已创建1行。


SQL> COMMIT;


提交完成。


SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE


 2  FROM USER_TAB_PARTITIONS


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE


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


T_PART                         P1                             100


T_PART                         P2                             200


T_PART                         P3                             300


T_PART                         SYS_P97                        400


对于INTERVAL分区表,新增的超过分区上限的数据会自动导致对应的INTERVAL分区被建立。


同样INTERVAL分区表可以方便的转化为RANGE分区表,只需要不输入INTERVAL的值即可:


SQL> ALTER TABLE T_PART SET INTERVAL ();


表已更改。


SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL


 2  FROM USER_PART_TABLES


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME                     PARTITION INTERVAL


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


T_PART                         RANGE


SQL> INSERT INTO T_PART


 2  VALUES (450, 'B', SYSDATE);


INSERT INTO T_PART


           *


第1行出现错误:


ORA-14400:插入的分区关键字未映射到任何分区


同时需要注意,不输入INTERVAL的值不等价于输入NULL:


SQL> ALTER TABLE T_PART SET INTERVAL (NULL);


ALTER TABLE T_PART SET INTERVAL (NULL)


*


第1行出现错误:


ORA-14752:间隔表达式不是正确类型的常数


除了RANGE分区表和INTERVAL分区表之间可以相互转化,INTERVAL分区也可以转化为RANGE分区:


SQL> ALTER TABLE T_PART SET INTERVAL (100);


表已更改。


SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL


 2  FROM USER_TAB_PARTITIONS


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME PARTITION_NAME  HIGH_VALUE                               INTERVAL


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


T_PART     P1              100                                      NO


T_PART     P2              200                                      NO


T_PART     P3              300                                      NO


T_PART     SYS_P97         400                                      NO


SQL> INSERT INTO T_PART


 2  VALUES (453, 'A', SYSDATE);


已创建1行。


SQL> INSERT INTO T_PART


 2  VALUES (743, 'B', SYSDATE);


已创建1行。


SQL> COMMIT;


提交完成。


SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL


 2  FROM USER_TAB_PARTITIONS


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME PARTITION_NAME  HIGH_VALUE                               INTERVAL


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


T_PART     P1              100                                      NO


T_PART     P2              200                                      NO


T_PART     P3              300                                      NO


T_PART     SYS_P97         400                                      NO


T_PART     SYS_P98         500                                      YES


T_PART     SYS_P99         800                                      YES


已选择6行。


除了MERGE PARTITION、SPLIT PARTITION之外,直接修改分区表为RANGE分区,也会使得所有现存的INTERVAL分区变成RANGE分区:


SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART')


 2  FROM DUAL;


DBMS_METADATA.GET_DDL('TABLE','T_PART')


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


 CREATE TABLE "YANGTK"."T_PART"


  (    "ID" NUMBER,


       "NAME" VARCHAR2(30),


       "CREATE_DATE" DATE


  ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(


 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK"


 PARTITION BY RANGE ("ID") INTERVAL (100)


(PARTITION "P1"  VALUES LESS THAN (100)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE


DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "P2"  VALUES LESS THAN (200)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "P3"  VALUES LESS THAN (300)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFA


ULT CELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "SYS_P97"  VALUES LESS THAN (400)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT C


ELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS )


SQL> ALTER TABLE T_PART SET INTERVAL ();


表已更改。


SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL


 2  FROM USER_TAB_PARTITIONS


 3  WHERE TABLE_NAME = 'T_PART';


TABLE_NAME PARTITION_NAME  HIGH_VALUE                               INTERVAL


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


T_PART     P1              100                                      NO


T_PART     P2              200                                      NO


T_PART     P3              300                                      NO


T_PART     SYS_P97         400                                      NO


T_PART     SYS_P98         500                                      NO


T_PART     SYS_P99         800                                      NO


已选择6行。


SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART')


 2  FROM DUAL;


DBMS_METADATA.GET_DDL('TABLE','T_PART')


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


 CREATE TABLE "YANGTK"."T_PART"


  (    "ID" NUMBER,


       "NAME" VARCHAR2(30),


       "CREATE_DATE" DATE


  ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(


 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK"


 PARTITION BY RANGE ("ID")


(PARTITION "P1"  VALUES LESS THAN (100)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "P2"  VALUES LESS THAN (200)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT C


ELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "P3"  VALUES LESS THAN (300)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_


CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "SYS_P97"  VALUES LESS THAN (400)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE


DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "SYS_P98"  VALUES LESS THAN (500)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFA


ULT)


 TABLESPACE "YANGTK" NOCOMPRESS ,


PARTITION "SYS_P99"  VALUES LESS THAN (800)


 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645


 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)


 TABLESPACE "YANGTK" NOCOMPRESS )


需要注意,INTERVAL分区在DBMS_METADATA获取的表结构中并不会出现,一旦转化为RANGE分区,则DBMS_METADATA获取的源数据会包括分区信息。


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