【问题标题】:Oracle - Create an index only if not existsOracle - 仅在不存在时创建索引
【发布时间】:2017-11-16 07:18:09
【问题描述】:

只有当它们不存在时,有没有办法在 oracle 中创建索引?

有点像

CREATE INDEX IF NOT EXISTS ord_customer_ix
   ON orders (customer_id);

【问题讨论】:

  • 不,没有。仅以编程方式(使用动态 SQL)捕获 ORA-01408 错误
  • @NicholasKrasnov “有什么办法吗?”可以给我看看吗?
  • 有点误读 ;-)。 @user7294900 刚刚发布了代码。

标签: oracle database-indexes


【解决方案1】:

如果索引存在,可以使用脚本删除索引,然后创建它。如果存在,则对 drop 进行错误检查:

BEGIN
   EXECUTE IMMEDIATE 'DROP INDEX ord_customer_ix';
EXCEPTION
   WHEN OTHERS
   THEN
      IF SQLCODE != -955
      THEN                           -- ORA-00955 index does not exist
         RAISE;
      END IF;
END;
/

CREATE INDEX ord_customer_ix
  ON orders (customer_id);
;

这非常简单,易于编码和理解。

【讨论】:

    【解决方案2】:

    如果不存在,请在 ORACLE 中创建索引。

    ALTER SESSION SET CURRENT_SCHEMA = PROD_INTG;
    DECLARE
      INDEX_EXISTS NUMBER;
    BEGIN
      SELECT COUNT(1)
      INTO INDEX_EXISTS
      FROM ALL_INDEXES AI,
        ALL_IND_COLUMNS AIC
      WHERE AI.TABLE_OWNER = 'PROD_INTG'
            AND AI.TABLE_NAME = 'PROCESS_APPLICATION'
            AND AI.INDEX_NAME = AIC.INDEX_NAME
            AND AI.OWNER = AIC.INDEX_OWNER
            AND AIC.COLUMN_NAME IN ('PST_CODE', 'PIZ_TYPE_ID');
      IF (INDEX_EXISTS) > 0
      THEN
        DBMS_OUTPUT.PUT_LINE('INDEX EXISTS  :');
      ELSE
        EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = PROD_INTG';
        EXECUTE IMMEDIATE 'CREATE INDEX PROD_INTG.IDX_IQC_APPS_IN_PROC_PST_PIZ
          ON PROD_INTG.PROCESS_APPLICATION (PST_CODE, PIZ_TYPE_ID) PARALLEL 16';
        EXECUTE IMMEDIATE 'ALTER INDEX PROD_INTG.IDX_IQC_APPS_IN_PROC_PST_PIZ NOPARALLEL';
        DBMS_OUTPUT.PUT_LINE('INDEX created  :');
      END IF;
      EXCEPTION
      WHEN OTHERS THEN
      IF SQLCODE IN (-2275, -955, -02431, -01430, -01451, -01408)
      THEN
        NULL;
      ELSE
        RAISE;
      END IF;
    END;
    /
    

    【讨论】:

      【解决方案3】:

      仅在不存在时添加索引:

      declare 
        already_exists  exception; 
        columns_indexed exception;
        pragma exception_init( already_exists, -955 ); 
        pragma exception_init(columns_indexed, -1408);
      begin 
        execute immediate 'create index ord_customer_ix on orders (customer_id)'; 
        dbms_output.put_line( 'created' ); 
      exception 
        when already_exists or columns_indexed then 
        dbms_output.put_line( 'skipped' );  
      end;     
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多