我在寫一些存儲在Oracle中的函數。其中之一是一個非常基本的函數,它將一個字符串作爲參數並返回另一個字符串。這裏是我的功能:爲什麼我不能在存儲函數中使用Like?
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」版本(過濾器在綁定變量上)選擇一個不同的執行計劃,以便在獨立運行時(它沒有綁定並且它可以決定訪問索引會更快)。但除非表格很大,否則我不會期望看到那麼大的差別。真的,你需要跟蹤兩者,看看發生了什麼。另外,你是否真的在帕爾姆傳球?如果不是,那''''是毫無意義的,如果你是,你是不是冒着多個會導致ORA-02112的比賽冒險? – 2013-04-25 07:16:37
@AlexPoole我沒有通過參數傳遞通配符,所以我會讓平等,但我只是好奇這樣的區別。我看了兩個版本的執行計劃,但沒有區別。在custcode列上有一個索引,他在這兩種情況下都使用 – bAN 2013-04-25 07:25:53