【问题标题】:Create index for DBMS_COMPARISON package error ORA-23629 : is not an eligible index为 DBMS_COMPARISON 包错误 ORA-23629 创建索引:不是合格索引
【发布时间】:2018-01-30 17:07:52
【问题描述】:

我正在尝试使用下面的 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 文档说:

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

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

我正在使用 -

Oracle 数据库 11g 企业版版本 11.2.0.4.0 - 64 位生产

【问题讨论】:

  • ORA-23629:DEV06_OWNER.IDX_TEST 不是表 DEV06_OWNER.FACILITY_PROD_TEMP 上用于比较的合格索引 ORA-06512:位于“SYS.DBMS_COMPARISON”,第 5008 行 ORA-06512:位于“SYS.DBMS_COMPARISON” ,第 448 行
  • 这是实际错误,可能是错字:)
  • 请不要使用 cmets 在问题中添加或更正信息。相反,您应该编辑问题以进行所需的任何更改。这次我已经做到了——以后请记住这一点。谢谢。

标签: sql oracle plsql oracle11g


【解决方案1】:

如果您在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',

【讨论】:

  • 我尝试使用唯一约束,但它给了我同样的错误,而且我忘记提及的另一件事是 contract_reference 列包含 NULL 值,因此我无法在其上创建主键!
猜你喜欢
  • 2020-08-22
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多