无法使用的分区Oracle / datastage

时间:2018-08-10 10:06:25

标签: oracle indexing partition datastage

我的数据阶段作业面临问题。我必须从ttperiodeas文件中在Oracle中填充表.csv。此屏幕快照显示了Oracle连接器中的SQL查询:

Oracle connector

这是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”及其分区不可用

请帮助我谢谢

2 个答案:

答案 0 :(得分:3)

该索引是全局索引(即未分区),因为定义末尾没有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完整性,实际上浪费了空间和会产生错误。)

答案 1 :(得分:0)

该消息说给定分区的索引不可用:因此您可以尝试使用

重建相应的索引分区
create index [index_name] rebuild partition [partition_name] 

(具有[index_name][partition_nme]的合适值。

在执行此操作之前,应检查user_indexes中索引分区的状态-因为您的错误消息看上去与Oracle错误消息通常不一样。

但是正如William Robertson指出的那样,由于该索引是全球索引,因此不适用于给定情况。