【Oracle】ORA-01722 invalid number

今天碰到了一个很奇怪的问题,原来很正常的系统突然报一个ORA-01722的错误出来。

查了一下网上的资料,大多都说是因为ORACLE隐式转换数据类型引起的问题,如:

http://271788203.iteye.com/blog/653942

http://271788203.iteye.com/blog/653945

http://yml.iteye.com/blog/1591550

http://hypgr.iteye.com/blog/410415

http://zwpy.iteye.com/blog/1407815

但我觉得又不完全是这么回事。当然,我只是觉得而已,目前我的能力无法让我说出个所以然来。

 

总之先记录一下我的情况,以后有机会再详细研究:

数据库系统是10g,里面有两个数据库实例,简称为A库和B库。两个库都有两张张结构一样的TEST1和TEST2表,表中有个CODE字段,类型是VARCHAR2,但是数据值是纯数字(如011,022,033……)。

不过B库的TEST1表没数据,我把A库的数据导出为SQL脚本,再导入到B库中。

之后运行程序查询B库TEST1表,后台就报了ORA-01722异常,但是同样的程序查询A库没有任何问题。

接着我把程序构建的SQL语句拿到PL/SQL中测试,在A库中查询没有问题,在B库查询依然报ORA-01722异常。

原始SQL语句大致如下:

SELECT * FORM (
    SELECT T1.CODE,
           SUM(CASE T1.MONTH=201201 THEN T1.PAY ELSE 0 END) MONTH1,
           SUM(CASE T1.MONTH=201202 THEN T1.PAY ELSE 0 END) MONTH2,
           SUM(CASE T1.MONTH=201203 THEN T1.PAY ELSE 0 END) MONTH3
      FROM TEST1 T1 GROUP BY CODE
    UNION ALL
    SELECT T1.CODE,
           SUM(CASE T1.MONTH=201201 THEN T1.BONUS ELSE 0 END) MONTH1,
           SUM(CASE T1.MONTH=201202 THEN T1.BONUS ELSE 0 END) MONTH2,
           SUM(CASE T1.MONTH=201203 THEN T1.BONUS ELSE 0 END) MONTH3
      FROM TEST1 T1 GROUP BY CODE
    ) TATOL  
 JOIN TEST2 T2 
   ON TATOL.CODE = T2.CODE
WHERE TATOL.CODE IN (011,022,033)


  

根据网上的方法,把TATLO.CODE用函数显示转换后,查询就正常了。

无论是用TO_CHAR还是TO_NUMBER,或者NVL也行。如下:

--前面代码略
WHERE TO_CHAR(TATOL.CODE) IN (011,022,033)

 或者把参数值用单引号包起来。如下:

--前面代码略
WHERE TATOL.CODE IN ('011','022','033')

 

你可能感兴趣的:(oracle,ORA-01722)