我的程序中有这段代码:
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_l
和new_value_l
都声明为VARCHAR2(255 CHAR)
以下是:
new_value_l history.new_value%TYPE;
old_value_l history.old_value%TYPE;
为什么即使将两个变量都声明为VARCHAR2
,它也表示该数字无效?
我知道我在这里错过了一小部分,但我无法发现它或理解我在这个故事中的错误。
修改
我正在比较的值:
new_value_l = 15
和old_value_l = 10
答案 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;
所以,你需要:
尝试使用trim
检查值中是否存在空格...
ELSIF trim(old_value_l) != trim(new_value_l)
...
我认为你也必须处理空值。
...
ELSIF trim(old_value_l) != trim(new_value_l)
...