本文介绍如何转换RANGE分区和INTERVAL RANGE分区。

RANGE分区转换为INTERVAL RANGE分区

ALTER TABLE...SET INTERVAL命令可将现有的RANGE分区表转换为INTERVAL RANGE分区表。

设置范围或时间间隔后,数据库会自动创建一个指定范围或时间间隔的新分区,并将数据插入到新分区中。

命令如下:

ALTER TABLE <table_name> SET INTERVAL (<constant> | <expression>);

关于INTERVAL参数的信息,请参见INTERVAL RANGE分区

INTERVAL RANGE分区转换为RANGE分区

SET INTERVAL()命令用于禁用INTERVAL RANGE分区。禁用后,数据库会将INTERVAL RANGE分区表转换为RANGE分区表,并将INTERVAL RANGE分区的范围或时间间隔设置为RANGE分区的范围或时间间隔。

命令如下:

ALTER TABLE <table_name> SET INTERVAL ();

示例

以下示例会将表sales从RANGE分区转换为INTERVAL RANGE分区,并在分区表中插入数据。

创建RANGE分区表sales。示例如下:

CREATE TABLE sales
(
  prod_id           int,
  prod_quantity     int,
  sold_month        date
)
PARTITION BY RANGE(sold_month)
(
  PARTITION p1
    VALUES LESS THAN('15-JAN-2019'),
  PARTITION p2
    VALUES LESS THAN('15-FEB-2019')
);

查询ALL_TAB_PARTITIONS视图。示例如下:

SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;

返回结果如下:

 partition_name |      high_value
----------------+----------------------
 P1             | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
 P2             | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(2 rows)

将RANGE分区表转换为INTERVAL RANGE分区表。示例如下:

ALTER TABLE sales SET INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'));

插入超过范围分区的数据。示例如下:

INSERT INTO sales VALUES (1,100,'05-APR-2019');
INSERT 0 1

插入数据后,再次查询ALL_TAB_PARTITIONS视图。示例如下:

SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;

成功插入数据,系统将生成一个INTERVAL RANGE分区名称,该名称因每个会话而不同。返回结果如下:

 partition_name |      high_value
----------------+----------------------
 SYS596430103   | FOR VALUES FROM ('15-MAR-19 00:00:00') TO ('15-APR-19 00:00:00')
 P1             | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
 P2             | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(3 rows)