我是靠谱客的博主 英勇老虎,最近开发中收集的这篇文章主要介绍oracle function index,基于自定义函数的Function-Based索引创建,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

6ee5639a40442445944d63b514b2dd02.png

留言版上的第2330号问题是:

在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 select 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.

历史上的今天...

>>

2009-01-23文章:

2007-01-23文章:

By eygle on 2006-01-23 10:59 |

Comments (2) |

SQL.PLSQL | 650 |

2 Comments

最后

以上就是英勇老虎为你收集整理的oracle function index,基于自定义函数的Function-Based索引创建的全部内容,希望文章能够帮你解决oracle function index,基于自定义函数的Function-Based索引创建所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部