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
ОБНОВЛЕНИЕ 2: Николай Краснов указал в комментарии обходной путь для первого пункта:
А как насчет 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
.
Таким образом, у вас будет раздел диапазонного разбиения и раздел интервального разбиения со всеми его преимуществами.
person
Florin Ghita
schedule
31.10.2012