目标:
电信号码表,
查询最大数,
条件中需要用到一个函数索引。说明:
在普通的SQL窗口中运行该查询,没有问题,使用了索引,速度比较快,但是在存储过程中使用该语句对应的语句就会非常的慢,大家帮忙看看是什么原因。语句:
SELECT MAX(PhonesID)
INTO t_sTempnum
FROM qry_phones
WHERE FN_TRN_NUMBER(PhonesID) IS NOT NULL;函数也也是非常的简单,就是进行异常处理,去掉无用的数据。
CREATE OR REPLACE FUNCTION FN_TRN_NUMBER(i_vValue IN VARCHAR2)
RETURN NUMBER DETERMINISTIC
IS
RESULT NUMBER;
BEGIN
BEGIN
RESULT := TO_NUMBER(i_vValue);
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;建索引:
create index XIE15QRY_PHONES on QRY_PHONES ("CCATS114"."FN_TRN_NUMBER"(TO_CHAR(PHONESID)));调用的存储过程可以类似的写成:
CREATE OR REPLACE PROCEDURE test_fn IS
t_sMaxid INTEGER;
BEGIN
SELECT MAX(PhonesID)
INTO t_sMaxid
FROM qry_phones
WHERE FN_TRN_NUMBER(PhonesID) IS NOT NULL;
END test_fn;=========================是不是在存储过程中,不能使用函数索引呢?还请各位多多指教。
RETURN(RESULT);
END FN_TRN_NUMBER;
电信号码表,
查询最大数,
条件中需要用到一个函数索引。说明:
在普通的SQL窗口中运行该查询,没有问题,使用了索引,速度比较快,但是在存储过程中使用该语句对应的语句就会非常的慢,大家帮忙看看是什么原因。语句:
SELECT MAX(PhonesID)
INTO t_sTempnum
FROM qry_phones
WHERE FN_TRN_NUMBER(PhonesID) IS NOT NULL;函数也也是非常的简单,就是进行异常处理,去掉无用的数据。
CREATE OR REPLACE FUNCTION FN_TRN_NUMBER(i_vValue IN VARCHAR2)
RETURN NUMBER DETERMINISTIC
IS
RESULT NUMBER;
BEGIN
BEGIN
RESULT := TO_NUMBER(i_vValue);
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;建索引:
create index XIE15QRY_PHONES on QRY_PHONES ("CCATS114"."FN_TRN_NUMBER"(TO_CHAR(PHONESID)));调用的存储过程可以类似的写成:
CREATE OR REPLACE PROCEDURE test_fn IS
t_sMaxid INTEGER;
BEGIN
SELECT MAX(PhonesID)
INTO t_sMaxid
FROM qry_phones
WHERE FN_TRN_NUMBER(PhonesID) IS NOT NULL;
END test_fn;=========================是不是在存储过程中,不能使用函数索引呢?还请各位多多指教。
RETURN(RESULT);
END FN_TRN_NUMBER;
解决方案 »
- 求救~~~多行转字符串
- 求Oracle上机学习资料
- 请问为什么Oracle监听后会有大量的等待连接?
- sql问题
- 在VC++中用OO4O连接Oracle怎么写连接池,还是不用写,直接用它的OSession下的DatabasePool..........急。。
- 函数调用问题
- oracle的库,太占空间啦. 有没有办法可以缩小???
- oracle UTL_FILE包如何实现追加文件内容
- oracle8.17安装问题
- 我64位操作系统,安装oracle12c后,在cmd命令打开显示Windows\system32;并且启动后输入命令都显示:不是内部或外部命令。。。。。。。
- 请问频繁插入和删除的表,怎么提高其性能?
- 关于Oracle 里面的sql 语句问题,有谁能帮我一下??
是不是存储过程中就不能用函数索引呢?
楼主还是从其它方面考虑问题
SELECT /*+ INDEX (QRY_PHONES XIE15QRY_PHONES) */
MAX(PhonesID)
FROM qry_phones
WHERE FN_TRN_NUMBER(PhonesID) IS NOT NULL
------------------------------------------------
存储过程中也就如强制索引提示
SELECT /*+ INDEX (QRY_PHONES XIE15QRY_PHONES) */
MAX(PhonesID)
INTO t_sMaxid
FROM qry_phones
WHERE FN_TRN_NUMBER(PhonesID) IS NOT NULL;一切问题都解决了,100万的数据只用了1秒,而且还是我的手提电脑上的数据库。
谢谢大家的抛砖引玉。