2016-03-02 5 views
2

Я пытаюсь использовать раздел для обмена на следующем примере схемы:Oracle - Ошибка на ОБМЕН РАЗДЕЛА с List-Range секционирования

CREATE TABLE TEMP_TABLE_00(
    CONTACT_ID NUMBER, 
    SECONDARY_CONTACT_FLAG NUMBER, 
    SOURCE_SYSTEM VARCHAR2(10 CHAR), 
    START_DATE DATE, 
    ACTIVE NUMBER, 
    SECONDARY_CONTACT_FLAGS NUMBER GENERATED ALWAYS AS (ACTIVE || SECONDARY_CONTACT_FLAG) VIRTUAL, 
    CONSTRAINT pk_temp_table_00 PRIMARY KEY (CONTACT_ID)) 

PARTITION BY LIST (SECONDARY_CONTACT_FLAGS) 
SUBPARTITION BY RANGE (START_DATE) 
(PARTITION p_ac_00 VALUES ('00') 
    (SUBPARTITION sp_ac_00_before_2014 VALUES LESS THAN (TO_DATE ('01.01.2014', 'DD.MM.YYYY')), 
    SUBPARTITION sp_ac_00_201401  VALUES LESS THAN (TO_DATE ('01.02.2014', 'DD.MM.YYYY')) 
)  
) 
ENABLE ROW MOVEMENT; 

create table TARGET_TABLE(
    CONTACT_ID NUMBER, 
    SECONDARY_CONTACT_FLAG NUMBER, 
    SOURCE_SYSTEM VARCHAR2(10 CHAR), 
    START_DATE DATE, 
    ACTIVE NUMBER, 
    SECONDARY_CONTACT_FLAGS NUMBER GENERATED ALWAYS AS (ACTIVE || SECONDARY_CONTACT_FLAG) VIRTUAL, 
    CONSTRAINT pk_target_table PRIMARY KEY (CONTACT_ID)) 
PARTITION BY LIST (secondary_contact_flags) 
SUBPARTITION BY RANGE (START_DATE) 
(PARTITION p_ac_00 VALUES ('00') 
    (SUBPARTITION sp_ac_00_before_2014 VALUES LESS THAN (TO_DATE ('01.01.2014', 'DD.MM.YYYY')), 
    SUBPARTITION sp_ac_00_201401  VALUES LESS THAN (TO_DATE ('01.02.2014', 'DD.MM.YYYY')) 
    ), 
    PARTITION p_ac_10 VALUES ('10') 
    (SUBPARTITION sp_ac_10_before_2014 VALUES LESS THAN (TO_DATE ('01.01.2014', 'DD.MM.YYYY')), 
    SUBPARTITION sp_ac_10_201401  VALUES LESS THAN (TO_DATE ('01.02.2014', 'DD.MM.YYYY')) 

), 
    PARTITION p_ac_01 VALUES ('01') 
    (SUBPARTITION sp_ac_01_before_2014 VALUES LESS THAN (TO_DATE ('01.01.2014', 'DD.MM.YYYY')), 
    SUBPARTITION sp_ac_01_201401  VALUES LESS THAN (TO_DATE ('01.02.2014', 'DD.MM.YYYY')) 

), 
    PARTITION p_ac_11 VALUES ('11') 
    (SUBPARTITION sp_ac_11_before_2014 VALUES LESS THAN (TO_DATE ('01.01.2014', 'DD.MM.YYYY')), 
    SUBPARTITION sp_ac_11_201401  VALUES LESS THAN (TO_DATE ('01.02.2014', 'DD.MM.YYYY')) 

) 
) 
ENABLE ROW MOVEMENT; 

INSERT INTO DM_KSCTSC.TEMP_TABLE_00 (CONTACT_ID, SECONDARY_CONTACT_FLAG, SOURCE_SYSTEM, START_DATE, ACTIVE) VALUES (1, 0, 'ABC', TO_DATE('20140101', 'YYYYMMDD'), 0); 
commit; 

При попытке обмена раздела:

alter table target_table exchange partition p_ac_00 with table TEMP_TABLE_00 without validation; 

даже несмотря на то, структура разделов идентична, Oracle возвращает

ORA-14292: Тип разбиения на таблицы должен соответствовать подразделу ионный тип составной перегородки

Есть ли другое решение, чем обмен каждым отдельным подразделением отдельно?

+0

вы можете проверить это: http://www.ypl.com/oracle/manuals/sql_ref/alter_table/html_deep/bk01ch12s01s06s06s06s02.html – MaxU

ответ

2

Для обмена разделами между таблицей разделов (СТ) и несегментированной таблицей (TMP) таблица TMP должна иметь ту же структуру, что и раздел PT.

I.e. если PT разбит на разделы, TMP не разбит на разделы.

Если PT разбит на группы, TMP разделен так же, как и подразделение PT.

В вашем случае проблема в таблице TMP (TEMP_TABLE_00), он должен быть разделен RANGE (таким же, как подразбиение TARGET_TABLE)

CREATE TABLE TEMP_TABLE_00(
    CONTACT_ID NUMBER, 
    SECONDARY_CONTACT_FLAG NUMBER, 
    SOURCE_SYSTEM VARCHAR2(10 CHAR), 
    START_DATE DATE, 
    ACTIVE NUMBER, 
    SECONDARY_CONTACT_FLAGS NUMBER GENERATED ALWAYS AS (ACTIVE || SECONDARY_CONTACT_FLAG) VIRTUAL, 
    CONSTRAINT pk_temp_table_00 PRIMARY KEY (CONTACT_ID)) 

PARTITION BY RANGE (START_DATE) 

    ( PARTITION sp_ac_00_before_2014 VALUES LESS THAN (TO_DATE ('01.01.2014', 'DD.MM.YYYY')), 
    PARTITION sp_ac_00_201401  VALUES LESS THAN (TO_DATE ('01.02.2014', 'DD.MM.YYYY')) 
)  

ENABLE ROW MOVEMENT; 

В этой установке обменны разделы работ.

+0

Большое вам спасибо, это работает! – royskatt