为DBMS_COMPARISON包错误创建索引ORA-23629:不是合格的索引

时间:2017-08-22 12:06:19

标签: sql oracle plsql oracle11g

我正在尝试使用以下create_comparison过程

对存在于同一数据库中的两个表进行比较
begin  
dbms_comparison.create_comparison(  
   comparison_name => 'comp_dbms_test',  
   SCHEMA_NAME => 'DEV06_OWNER',  
  OBJECT_NAME => 'facility_prod_temp',  
   INDEX_SCHEMA_NAME => 'DEV06_OWNER',  
  INDEX_NAME => 'idx_test',  
  dblink_name => null,  
  REMOTE_SCHEMA_NAME => 'DEV06_OWNER',  
   remote_object_name => 'facility_test_temp',  
   column_list => '*',  
  SCAN_MODE => DBMS_COMPARISON.CMP_SCAN_MODE_FULL);  
end;  

并低于错误 -

Error report:  
ORA-23629: DEV06_OWNER.IDX_TEST is not an eligible index on table DEV06_OWNER.FACILITY_PROD_TEMP for comparison
ORA-06512: at "SYS.DBMS_COMPARISON", line 5008
ORA-06512: at "SYS.DBMS_COMPARISON", line 448

这是表格的结构:

desc FACILITY_PROD_TEMP;  

Name                Null Type                 
------------------- ---- ------------------   
PARTITION_KEY            VARCHAR2(12)         
CONTRACT_REFERENCE       VARCHAR2(101 CHAR)   
CONTRACT_DESC            VARCHAR2(100 CHAR)   
ATTRIBUTE_3              VARCHAR2(100 CHAR)   
ATTRIBUTE_1              VARCHAR2(100 CHAR)   
COMMITED                 VARCHAR2(10 CHAR)    
ATTRIBUTE_6              VARCHAR2(100 CHAR)   
ATTRIBUTE_7              VARCHAR2(100 CHAR)   
ATTRIBUTE_8              VARCHAR2(100 CHAR)   
VALUE_DATE               VARCHAR2(30)         
ATTRIBUTE_5              VARCHAR2(100 CHAR)   
LGD                      VARCHAR2(30)         
DIM16                    VARCHAR2(100 CHAR)   
MATURITY_DATE            VARCHAR2(50)         
DIM9                     VARCHAR2(100 CHAR)   
IMPORT_SOURCE            VARCHAR2(100 CHAR)  

我使用以下语法 -

在contract_reference列上创建了一个索引
 create index idx_test on facility_prod_temp (contract_reference);

Oracle Doc说:

对于支持扫描模式CMP_SCAN_MODE_FULL和CMP_SCAN_MODE_CUSTOM,数据库对象必须具有以下类型的索引之一: •数字,时间戳,间隔,DATE,VARCHAR2或CHAR数据类型列上的单列索引

根据我在CONTRACT_REFERENCE列上创建了一个varchar2类型的索引。

我正在使用 -

Oracle Database 11g企业版11.2.0.4.0版 - 64位生产

1 个答案:

答案 0 :(得分:0)

如果您在the docs中进一步阅读,则说明

The index columns in a comparison must uniquely identify every row involved in 
a comparison. The following constraints satisfy this requirement:

- A primary key constraint
- A unique constraint on one or more non-NULL columns

因此,您需要在contract_reference列中添加主键或唯一约束:

alter table facility_prod_temp add constraint uk_fpt_temp unique (contract_reference);

然后您可以在dbms_comparison调用中使用该约束的索引(默认情况下,它共享相同的名称):

INDEX_NAME => 'uk_fpt_temp',