CREATE TABLE emp (
empno NUMBER(4),
ename VARCHAR2(30),
sal NUMBER
)
PARTITION BY RANGE(empno) (
partition e1 values less than (1000));
begin
for k in 2..200
loop
execute immediate
'alter table emp add partition e'||k||' values less than ('||k*1000||')';
end loop
end;
更新:在 11g 中存在指定范围分区间隔的功能,当您插入表时将创建分区。
但我不喜欢它,也不推荐它,原因有两个:
1 您应该始终保留第一个分区,因为是参考。如果你试图放弃它,你会得到SQL Error: ORA-14758: Last partition in the range section cannot be dropped
;
2 您无法控制分区名称(AFAIK)和间隔(这很难看)。如果您在将来错误地插入了一个值,则某些分区将被跳过,您将得到胖分区:(
研究了一点,没有胖分区。添加到示例中。)
Create table Z_TB_PART_TEST(
id number
)
partition by range(id)
interval(1000)
(
PARTITION PART_01 VALUES LESS THAN (1000)
);
INSERT INTO Z_TB_PART_TEST values (1500);
INSERT INTO Z_TB_PART_TEST VALUES (10000);
INSERT INTO Z_TB_PART_TEST VALUES (5000);
SELECT partition_name , high_value
FROM USER_TAB_PARTITIONS
WHERE table_name = 'Z_TB_PART_TEST';
PART_01 1000
SYS_P141 2000
SYS_P142 11000
SYS_P143 6000
UPDATE2:Nicholas Krasnov 在评论中指出了第一点的解决方法:
ORA-14758 怎么样?很容易避免:我们暂时将区间分区表转换为范围分区表(alter table tb_table_test set interval()
),删除分区,然后切换回区间分区表(alter table tb_part_test set interval(1000)
)。
它有效,我已经测试过了。但是应该注意,所有分区都会冻结,它们将是范围分区。如果您有间隙,则将保留(间隙中不会添加分区)。因此,参考分区将是更改为interval
. 这就是错误所说的:Last partition in the range section cannot be dropped
。
因此,您将获得一段范围分区和一段区间分区及其所有优点。