database - 如果在 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 -“名称已被现有对象使用”
请提出一些建议。
解决方案
这有效 -
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;
/
推荐阅读
- kotlin - 获取对调用函数的类的引用
- mysql - 检查 MySQL 数据库中的多个重复项
- winapi - 是否有预先存在的 WinAPI 来检查 some_app.exe 是否可以在不提供完整路径的情况下运行并在任何时候运行它
- java - hibernate 和persistence.xml 的问题
- python - 使用分类变量的 Kmeans
- r - R中有没有办法将组内的各种项目转换为多列?
- angular - Angular 8 - 在不访问 URL 参数的情况下跟踪显示的组件
- c# - Visual Studio 2017 Entity Framework 6.2.0 模型浏览器打开但为空白
- javascript - 如何配置 iFrame 打印的详细信息,例如标题等
- c - 试图理解 pthread_cond_signal()