- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0 |
留言版上的第2330号问题是:
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 createdSQL> 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 DETERMINISTICIS 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.
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |