首页 > 解决方案 > 如果在 Oracle 中存在,如何检查索引并删除 + 创建

问题描述

我正在为依赖于 Oracle 数据库的产品编写架构升级脚本。在一个领域,我需要在表上创建一个索引——如果该索引尚不存在。如果它存在,那么我需要删除它(因为更改现有索引不允许添加另一列)并使用相同的名称创建。我正在使用以下脚本 -

DECLARE
   i INTEGER;
BEGIN
  SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 
'ELEMENTS_5_NDX';
IF i = 0 THEN
    EXECUTE IMMEDIATE ('
    CREATE INDEX ELEMENTS_5_NDX
    ON elements_l
    (scode ASC, pkey ASC, START_DATE ASC, OPP_SEX_IND ASC)
    ');
ELSE
    EXECUTE IMMEDIATE ('DROP INDEX ELEMENTS_5_NDX');
    COMMIT;
    EXECUTE IMMEDIATE ('
    CREATE INDEX ELEMENTS_5_NDX
    ON elements_l
    (scode ASC, pkey ASC, START_DATE ASC, OPP_SEX_IND ASC)
    ');    
 END IF;
 END;
 /

我收到以下错误 - 错误报告:ORA-00955:名称已被现有对象使用 ORA-06512:在第 9 行 00955。00000 -“名称已被现有对象使用”

请提出一些建议。

标签: databaseoracleindexing

解决方案


这有效 -

 DECLARE
  i INTEGER;
 BEGIN
   SELECT COUNT(*) INTO i FROM all_objects WHERE index_name = 
   'ELEMENTS_5_NDX' and owner = sys_context( 'userenv', 'current_schema' );
   IF i > 0 THEN
    EXECUTE IMMEDIATE ('DROP INDEX ELEMENTS_5_NDX');
   END IF;
  EXECUTE IMMEDIATE ('CREATE INDEX ELEMENTS_5_NDX ON elements_l
   (scode ASC, pkey ASC, START_DATE ASC, OPP_SEX_IND ASC)');    
END;
/

推荐阅读