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;
UPDATE:在11g存在的特徵來指定範圍分區和分區的間隔在插入到表將被創建。
但我不喜歡它,我不推薦它的原因有兩個:
1,您應該保持百達的第一個分區,因爲是參考。如果你試圖放棄它,你會得到SQL Error: ORA-14758: Last partition in the range section cannot be dropped
;
2您無法控制分區名稱(AFAIK)
和間隔(這很醜陋)。如果錯誤地插入在未來的值某些分區將被跳過,你會發胖分區:
(研究痘痘並沒有FAT分區添加到實例。)
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:尼古拉斯克拉斯諾夫在評論中指出了一個解決方法:
那麼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
。
因此,您將有一段範圍分區和一段Interval分區及其所有優點。
您正在使用哪個版本的Oracle?如果11g,那麼你應該真的去做間隔分區,這將爲你做所有的工作。只需要小心地對數據加以限制,這樣錯誤的大值不會導致Oracle創建不必要的分區。 –