无法比较2个字符串 - 奇怪的错误

时间:2014-04-17 09:24:27

标签: sql oracle plsql oracle10g

我的程序中有这段代码:

IF old_value_l = new_value_l THEN 
      dummy_val_l := 0;

    ELSIF old_value_l != new_value_l THEN   -- This is line 4019 mentioned in the error
         -- some code here

END IF;

但这会引发一些奇怪的错误:

ORA-01722: invalid number
ORA-06512: at "DBS.MONITORING", line 4019
ORA-06512: at line 12

它清楚地说这个号码无效,但是等一下,什么号码? old_value_lnew_value_l都声明为VARCHAR2(255 CHAR)

以下是:

  new_value_l               history.new_value%TYPE;
  old_value_l               history.old_value%TYPE;

为什么即使将两个变量都声明为VARCHAR2,它也表示该数字无效?

我知道我在这里错过了一小部分,但我无法发现它或理解我在这个故事中的错误。

修改

我正在比较的值:

new_value_l = 15old_value_l = 10

2 个答案:

答案 0 :(得分:1)

它会自动转换为数字。因此,您可以按照以下方式进行测试:

select 1 from dual where '114' >120;
select 1 from dual where '125' >120;

您最好检查每个值是否包含一些无法转换为数字的字符,例如CRLF。

答案 1 :(得分:1)

这样的代码并没有告诉我们它们是数字,它告诉第一个变量在历史表中有类似new_value的类型,第二个变量在历史表中有类似old_value的类型。

new_value_l               history.new_value%TYPE;
old_value_l               history.old_value%TYPE;

所以,你需要:

  1. 确保这两列具有相同的数据类型VARCHAR2
  2. 有时错误出现在一行中,而实际错误出现在下一行或上一行中,因此您也必须检查它们
  3. 尝试使用trim

    检查值中是否存在空格
    ... 
    ELSIF trim(old_value_l) != trim(new_value_l) 
    ...
    
  4. 我认为你也必须处理空值。

    ... 
    ELSIF trim(old_value_l) != trim(new_value_l) 
    ...