教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> Oracle >> 开发技术 >> 基于自定义函数的Function-Based索引创建 RSS订阅
基于自定义函数的Function-Based索引创建
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   

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

来源:upschool.com.cn
作者:
关键字:基于自定义函数,Function,Based索引创建
发表日期:2007-1-6 1:01:19

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:使用DBMS_UTILITY转换Block地址   下一篇:Oracle XML Publisher与JDeveloper 10g集成


2008-11-21 0:32:29
本文的相类似文章
  • 在Oracle中发布和调用Java functions
  • 基于自定义函数的Function-Based索引创建
  • Function怎么返回一个数据集?
  • RAS API上的其他Function
  • 小议Function.apply() 之一---(函数的劫持与对象的复制)
  • 表达式动画之Functions
  • C++中的虚函数((virtual function)
  • C++中的虚函数((virtual function)
  • C++中的虚函数((virtual function)
  • Function-basedIndex
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com