Oracle SQL 报错:ORA-01722 无效数字

遇到一个非常长而复杂的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函数组合的方式,避免了数据类型的问题,成功解决问题。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值