【发布时间】:2013-04-25 06:58:54
【问题描述】:
我正在 Oracle 中编写一些存储函数。其中一个是一个非常基本的函数,它以字符串作为参数并返回另一个字符串。这是我的功能:
CREATE OR REPLACE
FUNCTION get_mail_custcode (
custcodeParam IN customer_table.custcode%TYPE)
RETURN VARCHAR2
IS
mail_rc contact_table.email%TYPE;
BEGIN
SELECT cc.email
INTO mail_rc
FROM contact_table cc, customer_table cu
WHERE cu.customer_id = cc.customer_id
AND cu.custcode like custcodeParam ;
RETURN mail_rc ;
END;
所以它不工作..该功能似乎运行良好,但执行没有任何结束..该功能是工作时间和时间,我在 2 或 3 分钟后手动取消操作(此查询通常会立即给出结果)。
在一次又一次地编写查询后,我终于(随机)将cu.custcode like custcodeParam 更改为cu.custcode = custcodeParam,它正在工作!!
所以我的问题是为什么?为什么我不能在存储函数中使用like 比较器?为什么这不会出错,但函数会无限期运行。
谢谢。
【问题讨论】:
-
custcode上有索引吗?您所做的是有效的,但也许 Oracle 正在为函数中的like版本(过滤器位于绑定变量上)选择不同的执行计划,以独立运行(未绑定并且可以决定索引访问会更快)。但除非桌子很大,否则我不会期望看到那么大的差异。确实,您需要同时跟踪两者以查看发生了什么。另外,你真的在parm中传递通配符吗?如果不是,like是没有意义的,如果你是,你是不是冒着多次匹配的风险,这会导致 ORA-02112? -
@AlexPoole 我没有在参数中传递通配符,所以我会让相等,但我只是对这种差异感到好奇。我查看了两个版本的执行计划,但没有区别。 custcode 列上有一个索引,两种情况都用他