过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com
建立函数索引须知DETERMINISTIC
上一篇 /
下一篇 2007-12-25 11:47:35
/ 个人分类:Oracle数据库技术-Tips
比如我们先写一个自定义的函数,此函数是将16进制转换为10进制
SQL> CREATE OR REPLACE FUNCTION hex2ten
2 (
3 p_str IN VARCHAR2,
4 p_from_base IN NUMBER DEFAULT 16
5 ) RETURN NUMBER
6 IS
7 l_num NUMBER DEFAULT 0;
8 l_hex VARCHAR2 (16) DEFAULT '0123456789ABCDEF';
9 BEGIN
10 FOR i IN 1 .. LENGTH (p_str)
11 LOOP
12 l_num := l_num * p_from_base + INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1))) - 1;
13 END LOOP;
14
15 RETURN l_num;
16 END hex2ten;
17 /
函数已创建。
我们建一个表做个测试
SQL> create table alan
2 as
3 select username, 'b' HEX from dba_users;
表已创建。
之后为这个表建立一个基于自定义的函数索引
SQL> create index alan_ind_fun on alan(hex2ten(HEX));
create index alan_ind_fun on alan(hex2ten(HEX))
*
ERROR 位于第 1 行:
ORA-30553: 函数不能确定
这是为什么呢?
这是因为我们在建立函数的时候没有加一个hint,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.
因此在建立function的时候我们可以加一个hint
SQL> drop function hex2ten
2 ;
函数已丢弃。
SQL> CREATE OR REPLACE FUNCTION hex2ten
2 (
3 p_str IN VARCHAR2,
4 p_from_base IN NUMBER DEFAULT 16
5 ) RETURN NUMBER DETERMINISTIC
6 IS
7 l_num NUMBER DEFAULT 0;
8 l_hex VARCHAR2 (16) DEFAULT '0123456789ABCDEF';
9 BEGIN
10 FOR i IN 1 .. LENGTH (p_str)
11 LOOP
12 l_num := l_num * p_from_base + INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1))) - 1;
13 END LOOP;
14
15 RETURN l_num;
16 END hex2ten;
17 /
函数已创建。
这样就可以成功的建立索引了。
SQL> create index alan_ind_fun on alan(hex2ten(HEX));
索引已创建。
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: