用户名:  密码:
兄弟在线   

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

作者:佚名 来源:网络 时间:2013-04-03

留言版上的第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.



编辑:admin 总点击 [2073]   评论  0 查看评论
上一篇:使用DBMS_UTILITY转换Block地址
下一篇:解决升级oracle10g中出现ora-01092错误的办法
【关闭窗口】
您可能感兴趣的文章
我要评论
          
评论标题:   可以输入250
 
验证数字: 4 + 6 =
兄弟友情提示
· 请自觉遵守国家有关法律、法规,尊重网上道德。
· 兄弟在线坚决抵制不良言行,违者文责自负。
· 如果文章有版权或其他问题等,请联系我们,我们会尽快处理。
· 文章注名来自网络的旨在传播共享信息,不做其它用途;注名原创的本站支持原创,但不代表同意其观点。
· 兄弟在线拥有管理用户与其文章和评论的一切权利,并有权在网站内转载或引用。
兄弟在线
兄弟热门文章
兄弟推荐文章
兄弟站内搜索

兄弟感兴趣的文章
兄弟最新影视