Неиспользуемый раздел Oracle / datastage

У меня проблема с моей работой по обработке данных. Мне нужно заполнить таблицу ttperiodeas в Oracle из .csv файла. SQL-запрос в соединителе Oracle показан на этом снимке экрана:

соединитель Oracle

А вот и сценарий оракула

  CREATE TABLE TTPERIODEAS 
  ( 
      CDPARTITION VARCHAR2(5 BYTE) NOT NULL ENABLE,
      CDCOMPAGNIE NUMBER(4,0) NOT NULL ENABLE, 
      CDAPPLI NUMBER(4,0) NOT NULL ENABLE, 
      NUCONTRA CHAR(15 BYTE) NOT NULL ENABLE, 
      DTDEBAS NUMBER(8,0) NOT NULL ENABLE,
      DTFINAS NUMBER(8,0) NOT NULL ENABLE,
      TAUXAS NUMBER(8,5) NOT NULL ENABLE,

      CONSTRAINT PK_TTPERIODEAS 
          PRIMARY KEY (CDPARTITION, CDCOMPAGNIE, CDAPPLI, NUCONTRA, DTDEBAS)
)
PARTITION BY LIST(CDPARTITION)
(PARTITION  P_PERIODEAS_13Q VALUES ('13Q')); 

При запуске задания я получаю следующее сообщение об ошибке и таблица не заполнена:

Индекс 'USINODSD0.SYS_C00249007' его раздел непригоден для использования

Пожалуйста, мне нужна помощь, спасибо


person younes    schedule 10.08.2018    source источник


Ответы (2)


Индекс является глобальным (т. Е. Не секционированным), потому что в конце определения нет using index local. Это также верно для индекса PK, показанного выше. (Я предполагаю, что это две разные вещи, потому что по умолчанию указанный выше DDL создаст индекс с именем PK_TTPERIODEAS, поэтому я не уверен, что такое SYS_C00249007.) Если вы можете удалить и перестроить их как локальные индексы (т.е. таблицу), то усечение или удаление раздела больше не делает индексы недействительными.

Например, вы можете перестроить первичный ключ как:

alter table ttperiodeas
    drop primary key;

alter table ttperiodeas 
    add constraint pk_ttperiodeas primary key (cdpartition,cdcompagnie,cdappli,nucontra,dtdebas)
    using index local;

Я не знаю, как определяется SYS_C00249007, но вы можете использовать что-то подобное.

Команда create table может выглядеть примерно так:

create table ttperiodeas 
( cdpartition  varchar2(5 byte) not null 
, cdcompagnie  number(4,0) not null 
, cdappli      number(4,0) not null 
, nucontra     varchar2(15 byte) not null 
, dtdebas      number(8,0) not null 
, dtfinas      number(8,0) not null 
, tauxas       number(8,5) not null 
, constraint pk_ttperiodeas
      primary key (cdpartition,cdcompagnie,cdappli,nucontra,dtdebas)
      using index local
)
partition by list(cdpartition)
( partition p_periodeas_13q values ('13Q') );

В качестве альтернативы вы можете добавить предложение update global indexes при удалении раздела:

alter table demo_temp drop partition p_periodeas_14q update global indexes;

(Кстати, NUCONTRA, вероятно, должен быть стандартным VARCHAR2, а не CHAR, который предназначен для кроссплатформенной совместимости и полноты ANSI, и на практике просто тратит место и создает ошибки.)

person William Robertson    schedule 10.08.2018
comment
снова привет, Уильям, - person younes; 10.08.2018
comment
не могли бы вы поделиться всем скриптом с созданием таблицы - person younes; 10.08.2018
comment
@younes: Я добавил образец create table. - person William Robertson; 10.08.2018
comment
Следует отметить, что вы можете использовать LOCAL для ПЕРВИЧНОГО КЛЮЧА (или любого другого УНИКАЛЬНОГО ИНДЕКСА), только если столбец ключа раздела также является частью составного ПЕРВИЧНОГО КЛЮЧА. - person Wernfried Domscheit; 10.08.2018

в сообщении говорится, что индекс для данного раздела непригоден для использования: поэтому вы можете попытаться перестроить соответствующий раздел индекса с помощью

create index [index_name] rebuild partition [partition_name] 

(с подходящими значениями для [index_name] и [partition_nme].

Прежде чем вы это сделаете, вы должны проверить статус разделов индекса в user_indexes, поскольку ваше сообщение об ошибке не похоже на сообщения об ошибках Oracle.

Но поскольку индекс является глобальным, как указал Уильям Робертсон, это неприменимо для данной ситуации.

person Martin Preiss    schedule 10.08.2018