遇到一个非常长而复杂的SQL,运行一年没出错,近期可能由于部分数据变动,使得SQL运行时报错01722,耗时一天,终于解决了。
首先放出来参考的博文,给了我一个好的处理方向,非常感谢。
把参考的博文放在下面引用了,可以直接查看。
ORACLE-023:令人烦恼的 ora-01722 无效数字
曾经一段时间内写sql语句时,老是莫名其妙的报ora-01722。
对于这个错误提示,尤其是对于一个复杂的sql语句,很是郁闷,因为很多时候都不知所然。
通过每次碰到的总结,其实也不是那么难以解决的,主要原因是:
1、对于两个类型不匹配(一个数字类型,一个非数字类型,同下)的值进行赋值操作;
2、两个类型不匹配的值进行比较操作(例如,“=”);
3、to_number函数中的值,非数字的,比如,to_number(‘a’)肯定是不行的,to_number(‘12306’)则是正常的。
要避免这些问题,要做到在写sql语句时就好认真处理好不同类型的问题。
比如如果要比较的话,同时都用to_number强制转换(to_number(字段a) = to_number(字段b)),
或者同时转换为字符串类型(字段a||’’ = 字段b||’’,都连接一个空字符串使之变成字符串类型)。
在语句中使用to_number函数时,要保证值一定是数字格式,或者写好异常处理。
当我们碰到这个错误提示时,就从所有用到的数字类型的字段开始检查,逐一排查,从而解决问题。
————————————————
版权声明:本文为CSDN博主「杨友山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yysyangyangyangshan/article/details/51762746
解决过程:
1 - 对复杂SQL进行子查询的拆分,单个执行,逐一查看全部结果集,如果没有报错说明不是这一部分的数据问题,那就继续执行下一个子查询。
2 - 在多个子查询结果连接查询时发现报错 01722。
3 - 对报错的这一部分子查询,对他的列使用折半法查找是哪个列出错了,发现有一个列使用DECODE函数报错了。
4 - 将DECODE函数改为使用CASE WHEN 和 INSTR函数组合的方式,避免了数据类型的问题,成功解决问题。