遇到的一个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:无效数字 - 准备好的语句

什么是“oracle ORA-01722”无效数字?

Oracle sql 错误 ora-01722 无效数字 ora-02063 前行来自

ORA-01722: 插入行时数字无效

讨厌麻烦的ora 01722无效数字

ORA-01722: 无效的数字 where 子句