由to_number引起的间歇性Ora 1722错误

时间:2011-07-20 14:52:17

标签: sql plsql oracle11g

我正在研究一个我无法弄清楚的问题,但我相信我今天取得了一些进展。在where子句中,有以下代码:

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列可以包含“&gt;”中的任何内容将'&gt; 15'改为'13 .68'至'无结果'至'1.2.3.4'等。无效数字错误仅间歇发生,而不是每次都发生。我已经尝试使用'[^ 0-9。]'的表达式替换Translate和Regexp_Replace,但这也无法解决问题。我在SO上找到了这个:

Here is a similar question I stumbled accross.

在该帖子中,似乎可能导致错误,因为没有明确的操作顺序。我可能遇到同样的情况吗?如果没有,否则可能会导致这种行为?

谢谢!

1 个答案:

答案 0 :(得分: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列中的数据没有被字符串处理函数转换为有效数字。