--如果表已存在就删除测试表
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;
例子说明:
这个结果集中,如果只是使用了系统函数,比如第一条和第二条记录;这种当然不需要重建;
而第三条,我们就需要重建,因为这个是被我们重新编译过的函数;我们复制这个定义,把 CREATE INDEX 替换成 CREATE OR REPLACE INDEX 后执行即可。
文章
阅读量
获赞