2011-07-20 28 views
1

我正在處理一個我無法弄清楚的問題,但我相信我今天取得了一些進展。在where子句,有以下代碼:由to_number引起的間歇性Ora 1722錯誤

AND to_number(REPLACE(TRANSLATE (decode(INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ','')) >= 10 

現在,這種hra_ans.answer_text列可以包含從「>」什麼「> 15」到'13 0.68' 到‘無結果’到「1.2。 3.4'等。無效數字錯誤只是間歇性地發生,並非每次都發生。我嘗試用'[^ 0-9。]'的表達式替換Translate with Regexp_Replace,但那也不能解決問題。我發現這對SO:

Here is a similar question I stumbled accross.

在那個崗位,似乎可以將誤差造成的,因爲有操作沒有明確的順序。我可能遇到同樣的情況嗎?如果沒有,否則可能會導致這種行爲?

謝謝!

回答

1

如果你可以宣佈一個新的功能,最簡單的方法可能是像做

CREATE FUNCTION my_to_number(p_str IN VARCHAR2) 
    RETURN NUMBER 
IS 
    l_num NUMBER; 
BEGIN 
    BEGIN 
    l_num := to_number(p_str); 
    EXCEPTION 
    WHEN others THEN 
     l_num := NULL; 
    END; 

    RETURN l_num; 
END my_to_number; 

,然後用它在查詢

AND my_to_number(hra_ans.answer_text) >= 10 

我敢打賭有數據在ANSWER_TEXT列中,您的字符串處理函數沒有變爲有效的數字。

+0

假設數據中沒有字符不會被TRANSLATE處理,你知道爲什麼錯誤仍會發生嗎? –

+0

@mpminnich - 我最初的預感是有些字符不是由TRANSLATE函數處理的。如果我們排除這種情況,可能會出現諸如NLS設置等問題,因爲某些會話使用歐洲NLS設置(其中小數點分隔符是逗號而非句點),因此會出現間歇性錯誤。但我傾向於認爲數據本身存在問題的可能性更大(例如,歐洲用戶輸入13,68而不是13.68,或者美國用戶輸入1,234.68,而您沒有處理像逗號這樣的字符)。 –

+0

我會試試這個功能,如果它能正常工作,我會接受你的答案。如果沒有,我會回來的! :-) 謝謝。 –