遇到的一个ORA-01722,无效数字的问题
Posted moredrinkhotwater
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遇到的一个ORA-01722,无效数字的问题相关的知识,希望对你有一定的参考价值。
错误现象如上图,
当dataowner=990的时候,SQL执行正常,当dataowner=991的时候,SQL执行报错,ORA-01722,无效数字
首先,我认为代码是不应该出现偶然性、随机性这种概念,但是我没有考虑到原始数据这个因素
问题出在timestr这个字段上,这是一个char类型的字段
我在编码SQL的时候,使用了char=1这样的谓词
我凭借自己的经验得到如下结论:
Oracle是在比较数据时,存在隐式转换的机制
"When comparing a character value with a NUMBER value, Oracle converts the character data to NUMBER."
查看执行计划之后,执行器隐式地对timestr这个字段做了to_number的操作
报错的原因其实很简单
当对dataowner=991的数据distinct该字段的时候,我们得到了‘’这样的数据
并不是null也不是‘’,是一个空格
执行以下SQL
select to_number(‘ ‘) from dual;
返回的就是ORA-07222,无效数字报错。
反而对null值执行to_number()函数,没有报错
以上是关于遇到的一个ORA-01722,无效数字的问题的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLSyntaxErrorException-ORA-01722:无效数字 - 准备好的语句