我们在写PL/SQL语句时,经常会用到字符串A与数字B的比较,而很多人的做法是直接做比较,殊不知Oracle会隐含地先将字符串A转换为数字,然后再与数字B做比较,这样做之后,就出现隐患了,即当时写程式时,无论怎么测试都不会出现错误,一旦运行一段时间后,系统使用者就会反映“Form程式出现异常或者是Report出现异常”,而异常就是“ORA-01722: 无效数字或者ORA-01722: invalid number”,而开发者在查找原因时,却会感觉莫名其妙,觉得不可能。
其实,原因很简单,就是在写PL/SQL时,书写不规范造成的,即尽量少使用隐含转换。
排除错误方法:可以先从Where语句中查找,检查是否存在数据类型隐含转换的情况,然后在Select语句中,检查是否存在数据类型隐含转换的情况,还要检查所使用的函数如Nvl、Decode等,检查这些函数中所引用的栏位,是否存在数据类型隐含转换的情况。
例子如下:
-- Create table
create table Test
(
ORDER_Num VARCHAR2(8)
);
insert into Test(Order_Num) Values('123456');
insert into Test(Order_Num) Values('123457');
insert into Test(Order_Num) Values('12345-1');
insert into Test(Order_Num) Values('12345-2');
出错的语句:
Select t.Order_Num, Decode(t.Order_Num, 123456, 'a', 'b') From Test t
where t.order_num < 223456;
改正为:
Select t.Order_Num, Decode(t.Order_Num, '123456', 'a', 'b') From Test t
where t.order_num < '223456';