错误现象如上图,
当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()函数,没有报错
原文地址:https://www.cnblogs.com/MoreDrinkHotWater/p/9713676.html
时间: 2024-10-20 04:02:28