脚本分享 Oracle索引发布冲突解决方案

2024年 5月 30日 70.8k 0

你说说气不气人,你维护这大几十套数据,经常要发布,然后接到如下需求:

帮我建两个索引,第一个可能有部分公司有,有部分没有,有的话就删除重建,没有直接创建。第二个是有部分是分区表有部分是普通表,你根据情况来吧。分区表建本地索引,非分区表搞个普通索引就好。

DROP INDEX ind_zhanky;
create index ind_zhankyon zhanky( ioid, prodno );
DROP INDEX ind_zhanky1;
create index ind_zhanky_bsipqion zhanky1(BranchId,StoreId,IoId,ProdId,QualityStatus,InvBalQty) local;

是的接到需求第一时间我在找刀,还好理智战胜了那啥。于是乎我就想,你这个人怪好的,还帮我写了个drop。居然这样我也不是不讲情面的人。

以后类似上述需求的,提交发布脚本时按照如下格式提交,避免执行报错。

--创建索引冲突
DECLARE
v_index_exists NUMBER;
BEGIN
SELECT COUNT(*) INTO v_index_exists FROM USER_INDEXES WHERE INDEX_NAME = upper('ind_zhanky') AND TABLE_NAME = upper('zhanky');
IF v_index_exists > 0 THEN
EXECUTE IMMEDIATE 'DROP INDEX ind_zhanky';
END IF;
EXECUTE IMMEDIATE 'create index ind_zhankyon zhanky( ioid, prodno )';
END;
/

--创建分区本地索引冲突
DECLARE
v_is_partitioned NUMBER;
v_index_exists NUMBER;
BEGIN
SELECT COUNT(*) INTO v_is_partitioned FROM USER_TABLES WHERE TABLE_NAME = upper('zhanky1') and PARTITIONED='YES';
SELECT COUNT(*) INTO v_index_exists FROM USER_INDEXES WHERE INDEX_NAME = upper('ind_zhanky_bsipqi') AND TABLE_NAME = upper('zhanky1');
IF v_index_exists > 0 THEN
EXECUTE IMMEDIATE 'DROP INDEX ind_zhanky_bsipqi';
END IF;
IF v_is_partitioned > 0 THEN
EXECUTE IMMEDIATE 'create index ind_zhanky_bsipqion zhanky1(BranchId,StoreId,IoId,ProdId,QualityStatus,InvBalQty) local';
ELSE
EXECUTE IMMEDIATE 'create index ind_zhanky_bsipqion zhanky1(BranchId,StoreId,IoId,ProdId,QualityStatus,InvBalQty)';
END IF;
END;
/

注意:如果你发布用的就是当前用户是可以套用上面的脚本,如果是其它用户需要注意吧user视图改成dba视图,然后加上owner。

坑填完了心里舒服多了。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论