你说说气不气人,你维护这大几十套数据,经常要发布,然后接到如下需求:
帮我建两个索引,第一个可能有部分公司有,有部分没有,有的话就删除重建,没有直接创建。第二个是有部分是分区表有部分是普通表,你根据情况来吧。分区表建本地索引,非分区表搞个普通索引就好。
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。
坑填完了心里舒服多了。