基于自定义函数的Function-Based索引创建

文章作者 100test 发表时间 2007:12:01 14:10:26
来源 100Test.Com百考试题网


在oralce中给自建函数创建索引,结果不成功。

source:Create Index IDX_T_SP_TWOTYPESTAT_0_f On T_SP_TWOTYPESTAT_0(f_dateadd(yearmonth,12,2)).
err:the function is not deterministic.

我们看一下这是为什么?

随便一个测试可以再现这个问题,我门创建一个函数(本范例函数用于进行16进制向10进制转换):

CREATE OR REPLACE FUNCTION h2ten (
p_str IN VARCHAR2,
p_from_base IN NUMBER DEFAULT 16
)
RETURN NUMBER
IS
l_num NUMBER DEFAULT 0.
l_hex VARCHAR2 (16) DEFAULT 0123456789ABCDEF.
BEGIN
FOR i IN 1 .. LENGTH (p_str)
LOOP
l_num :=
l_num * p_from_base INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1)))
- 1.
END LOOP.
   RETURN l_num.
END h2ten.

此时创建索引,获得如下错误信息:

SQL> create table t as 0select username,a hex from dba_users.
Table created
SQL> create index i_t on t (h2ten(hex)).
create index i_t on t (h2ten(hex))
ORA-30553: The function is not deterministic

如果需要创建基于自定义函数的索引,那么我们需要指定deterministic参数:

CREATE OR REPLACE FUNCTION h2ten (
p_str IN VARCHAR2,
p_from_base IN NUMBER DEFAULT 16
)
RETURN NUMBER DETERMINISTIC
IS
l_num NUMBER DEFAULT 0.
l_hex VARCHAR2 (16) DEFAULT 0123456789ABCDEF.
BEGIN
FOR i IN 1 .. LENGTH (p_str)
LOOP
l_num :=
l_num * p_from_base INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1)))
- 1.
END LOOP.
   RETURN l_num.
END h2ten.

此时创建索引即可:

SQL> create index i_t on t (h2ten(hex)).
Index created 

Oracle这样解释这个参数:

The hint DETERMINISTIC helps the optimizer avoid redundant function calls. If a stored function was called previously with the same arguments, the optimizer can elect to use the previous result. The function result should not depend on the state of session variables or schema objects. Otherwise, results might vary across calls. Only DETERMINISTIC functions can be called from a function-based index or a materialized view that has query-rewrite enabled.



相关文章


XP真正的Administrators
XP系统组件惊现高危漏洞但未影响Vista
Windows批处理大全(附各种实例)
保护重要文件用Vista“备份副本”功能
基于自定义函数的Function-Based索引创建
使用DBMS_UTILITY转换Block地址
AIX下字符界面安装oracle10g过程
给您的U盘安装linux
详细讲解:关于Linux操作系统的进程管理
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛