ORA-01722:invalid number

简介: Oracle表字段为`VARCHAR2`时,where条件出现`NUMBER`的匹配,`可能`会出现该错误。

项目场景

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"

数据
在这里插入图片描述
已知字段NAMEVARCHAR2类型

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会先将该字段下的所有数据转成数字类型,进行比对过滤,会损失一部分性能
在这里插入图片描述

相关文章
|
4月前
|
SQL Oracle 关系型数据库
【已解决】ORA-01722: invalid number
【已解决】ORA-01722: invalid number
129 0
|
4月前
【已解决】nested exception is java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
【已解决】nested exception is java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
59 0
|
数据库管理
[20161129]BBED-00209 invalid number.txt
[20161129]BBED-00209 invalid number (9524782f).txt --以前遇到的问题,现在补充测试看看。 BBED> modify /x 9524782f  offset 492 BBED-00209: invalid ...
1695 0
|
Oracle 关系型数据库 MySQL
ERROR 1292 (22007): Truncated incorrect DOUBLE value 和ORA-01722: invalid number
其实这种错误和隐式转换有关 主要是由于转换的时候不能转换为期望的格式的然后出的问题 比如 1p这个字符要转换为 int(number)是不可能的 MYSQL 错误模拟如下: myql> show variables like 'sql_mode%'; +--...
3465 0
|
10月前
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
89 1
|
3月前
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
4月前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
34 0
|
10月前
|
存储
Leetcode Single Number II (面试题推荐)
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
33 0
|
算法
LeetCode 414. Third Maximum Number
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
85 0
LeetCode 414. Third Maximum Number
|
存储
LeetCode 313. Super Ugly Number
编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。
89 0
LeetCode 313. Super Ugly Number