注册
函数索引 | 函数索引的基础函数定义发生修改 的错误处理 | 自定义函数索引在数据迁移后一定要注意

函数索引 | 函数索引的基础函数定义发生修改 的错误处理 | 自定义函数索引在数据迁移后一定要注意

hql 2021/11/28 2288 4 0
摘要 我们在迁移完成后,经常喜欢重新编译一次所有的函数;如果有函数索引的话,这么编译一下,往往就会搞出问题、留下隐患,让相关表上的插入都报错了。要规避这个问题,我们在编译后,需要重建系统中涉及自定义函数的所有索引。本文提供了一个快速找到系统中函数索引的SQL,在文章结尾。

测试场景

--如果表已存在就删除测试表 drop table if exists tab1; --新建测试表 create table tab1(v1 int); --新建测试的确定性函数 create or replace function fun_01(v1 int) return int deterministic AS begin return v1+1; end; --基于测试的确定性函数新建函数索引 create index idx_tab1_fun01 on tab1(fun_01(v1)); --这个时候执行插入语句:执行成功 insert into tab1 values(1); -- 执行成功 --我们重新编译这个函数 alter function fun_01 compile; --这个时候,再执行插入语句,执行报错了 【说明:不要随便重新编译函数】 insert into tab1 values(1); -- 执行失败: /* 总共1个语句正依次执行... [执行语句1]: insert into tab1 values(1); 执行失败(语句1) 第1 行附近出现错误[-7129]: 函数索引的基础函数定义发生修改 1条语句执行失败 */ --如果遇到这类问题,我们重建下这个表上的索引的函数索引即可 create or replace index idx_tab1_fun01 on tab1(fun_01(v1)); --重建后,在插入,执行成功。 insert into tab1 values(1); -- 执行成功

我们怎么快速的找到全库中的函数索引?

select cast(dbms_metadata.get_ddl('INDEX', OBJ.NAME, sch.name) AS VARCHAR) DDL, DM_BIT_TEST(XTYPE, 2) , sch.name , obj.name , * from SYSINDEXES idx, SYSOBJECTS sch, SYSOBJECTS obj where sch.id =obj.schid and obj.id =idx.id and DM_BIT_TEST(XTYPE, 2)=1;

例子说明:
image.png

这个结果集中,如果只是使用了系统函数,比如第一条和第二条记录;这种当然不需要重建;
而第三条,我们就需要重建,因为这个是被我们重新编译过的函数;我们复制这个定义,把 CREATE INDEX 替换成 CREATE OR REPLACE INDEX 后执行即可。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服