项目场景
Oracle表字段为VARCHAR2
时,where条件出现NUMBER
的匹配,可能
会出现该错误。
问题描述
test表结构如下
CREATE TABLE “lzy”.“TEST”
( “NAME” VARCHAR2(255)
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE “lzy”
数据
已知字段
NAME
为VARCHAR2
类型
SELECT * FROM TEST WHERE NAME = 1
数据只有1时,不报错;
数据包含非数字,使用上述sql 查询,报错 ora-01722:invalid number
结论
当表中数据全部为 数字,不会报错;
当表中数据包含 非数字,会报错。
原因分析
带着上面的结论,我们查找原因
查看Oracle的sql执行计划
explain plan for SELECT * FROM TEST WHERE NAME = 1;
select * from TABLE(dbms_xplan.display);
如图,发现了端倪
oracle会将字段通过to_number函数强转为NUMBER类型,再进行比对过滤
问题就出现在to_number函数这里,非数字强转NUMBER会报错ora-01722:invalid number
解决方案
方案一(推荐)
老老实实比对正确的字段类型
SELECT * FROM TEST WHERE NAME = '1';
字段是什么类型就比对什么类型
方案二(不推荐)
当表中该字段的数据全部为数字类型
的值,强转不会报错,也就可以继续使用该SQL查询
但不推荐使用,原因有两点
1.容错性低。一旦数据被污染,线上一直报错,等着扣工资吧
2.效率低。Oracle会先将该字段下的所有数据转成数字类型,进行比对过滤,会损失一部分性能
原文地址:https://blog.csdn.net/kkk123445" target="_blank" rel="noopener" title="像风一样 ">像风一样 </a> <img class="article-time-img article-heard-img" src="https://csdnimg.cn/release/blogv2/dist
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。