暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 西瓜你个吧啦 2024-05-30
221

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

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

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。


坑填完了心里舒服多了。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论