为什么 DBMS_UTILITY.COMPILE_SCHEMA 会破坏基于函数的索引?

evg*_*345 5 oracle

批量结构更新后,一些视图/过程变得无效。

所以我只是重新编译它们:

exec dbms_utility.compile_schema( USER )
Run Code Online (Sandbox Code Playgroud)

但在那之后,之前状态良好的所有基于函数的索引都被破坏了,针对这些表的 SQL 语句失败了。这就是问题所在。

此类索引的示例:

CREATE INDEX DOCUMENTS_NMBR_UCN_FIDX ON DOCUMENTS(Str2Number(NUMBER_UCN));

CREATE INDEX DOCUMENTS_DATE_FIDX ON DOCUMENTS(Date2Number(REG_DATE));
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Col*_*art 7

Oracle 正在编译所有对象,因此就 Oracle 而言,所有对象中的所有代码都是新代码。

因此,Oracle 无法知道您的函数Str2Number仍然返回创建索引时使用的相同值。

相反,您应该只重新编译无效对象,

exec dbms_utility.compile_schema(user, false);
Run Code Online (Sandbox Code Playgroud)

会这样做。