Oracle - 仅在不存在时创建索引
Posted
技术标签:
【中文标题】Oracle - 仅在不存在时创建索引【英文标题】:Oracle - Create an index only if not exists 【发布时间】:2017-11-16 07:18:09 【问题描述】:只有当它们不存在时,有没有办法在 oracle 中创建索引?
有点像
CREATE INDEX IF NOT EXISTS ord_customer_ix
ON orders (customer_id);
【问题讨论】:
不,没有。仅以编程方式(使用动态 SQL)捕获ORA-01408
错误
@NicholasKrasnov “有什么办法吗?”可以给我看看吗?
有点误读 ;-)。 @user7294900 刚刚发布了代码。
【参考方案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;
【讨论】:
接缝成为 Ask Tom 的官方答案:asktom.oracle.com/pls/apex/…以上是关于Oracle - 仅在不存在时创建索引的主要内容,如果未能解决你的问题,请参考以下文章