【问题标题】:Intermittent Ora 1722 errors caused by to_number由 to_number 引起的间歇性 Ora 1722 错误
【发布时间】:2011-07-20 14:52:16
【问题描述】:

我正在研究一个我无法弄清楚的问题,但我相信我今天取得了一些进展。在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 列可以包含从“>”到“>15”到“13.68”到“无结果”到“1.2.3.4”等任何内容。无效数字错误只会间歇性发生,而不是每次时间。我尝试使用表达式“[^0-9.]”将 Translate 替换为 Regexp_Replace,但这也不能解决问题。我在 SO 上找到了这个:

Here is a similar question I stumbled accross.

在那篇文章中,似乎由于没有明确的操作顺序而导致错误。我有可能遇到同样的情况吗?如果不是,是否会导致这种行为?

谢谢!

【问题讨论】:

    标签: sql plsql oracle11g


    【解决方案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 列中的数据没有被您的字符串处理函数转换为有效数字。

    【讨论】:

    • 假设数据中没有字符不会被TRANSLATE处理,你知道为什么还会出现错误吗?
    • @mpminnich - 我最初的预感是有些字符没有被 TRANSLATE 函数处理。如果我们排除这种情况,可能会出现诸如 NLS 设置之类的问题,因为某些会话使用欧洲 NLS 设置(其中小数分隔符是逗号而不是句点),因此会出现间歇性错误。但我倾向于打赌数据本身更有可能存在问题(即欧洲用户输入 13,68 而不是 13.68 或美国用户输入 1,234.68 而您没有处理逗号之类的字符)。
    • 我会试试这个功能,如果它有效,我会接受你的回答。如果没有,我会回来的! :-) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多