2011-07-20 18 views
1

私は分かりませんが、私は今日何か進歩を遂げたと信じています。断続的なオラ1722のエラーto_numberによって引き起こされる

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」0.68' '13までに「>」から何かを含めることができます何もありません1.2 『への」に』 where句では、次のコードがあります。 3.4 'などです。無効な数値エラーは、毎回ではなく断続的に発生します。私は '[^ 0-9。]'の式を使ってTranslateを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

私は関数を試してみましょう、それが動作する場合、私はあなたの答えを受け入れるでしょう。そうでなければ、私は戻ってきます! :-)ありがとう。 –

関連する問題