Разбить партицию на 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;
Хостинг от uCoz