Разбить партицию на 2 части.
При разделе по дате, Oracle требует указания полного формата даты. В данном случае использованы приёмы для компактного хранения старых, не подлежащих изменениям, данных. Это опции compress и pctfree 0
ALTER TABLE BOOK
SPLIT PARTITION BOOK2
AT (TO_DATE('27-10-2004','DD-MM-YYYY') )
INTO (PARTITION book2 compress TABLESPACE USERS_B PCTFREE 0,
PARTITION book3 TABLESPACE USERS_B PCTFREE 15);
Объеденить 2 партиции.
При объединении партиций, когда они сами находятся в одном таблспейсе и там же будет результирующая партиция, требуется свободное место для результата. То есть объединение происходит физическое, а не на логическом уровне (путём соотв. изменения записей в системных таблицах), хотя возможны исключения, если опции хранения данных в таблицах одинаковые и не будут изменяться.
ALTER TABLE BOOK
MERGE PARTITIONS BOOK1, BOOK2
INTO PARTITION BOOK2
TABLESPACE USERS_RO PCTFREE 0 INITRANS 1 STORAGE (BUFFER_POOL DEFAULT) NOLOGGING;
Переместить партицию.
ALTER TABLE BOOK MOVE PARTITION BOOK2 TABLESPACE USERS_2;
Исправить индекс
После некоторых операций с партициями, индексы на этой таблице могут приходить в состояние 'INUSABLE'. Глобальные индексы разваливаются практически всегда, партиционированные не всегда, но тем не менее тоже частенько. В этом случае нужно их пересоздать.
ALTER INDEX BOOK#date1 REBUILD PARTITION book2;
Поскольку индексов, а тем более их партиций может быть много, эту операцию можно доверить подобной процедуре:
DECLARE
tbl_name VARCHAR2(50):='BOOK';
txt_sql VARCHAR2(150);
CURSOR bad_indexes IS
SELECT p.index_owner, p.index_name, partition_name
FROM sys.DBA_IND_PARTITIONS p, sys.DBA_INDEXES i
WHERE i.index_name=p.index_name AND p.status='INUSABLE'
AND i.table_name=tbl_name;
BEGIN
FOR bad IN bad_indexes LOOP
txt_sql:='ALTER INDEX '||bad.index_owner||'.'||bad.index_name||' REBUILD PARTITION
'||bad.partition_name;
EXECUTE IMMEDIATE txt_sql;
END LOOP;
END;