Oracle Sql问题定位记录(ORA-01722: invalid number)

模拟场景,有一张Oracle 表:TEST

DDL:

CREATE TABLE TEST (

  "USER_ID" VARCHAR2(50 BYTE) NOT NULL ,

  "USER_NAME" VARCHAR2(255 BYTE)

)

插入数据:

INSERT INTO "TEST" VALUES ('1000', 'test01');

INSERT INTO "TEST" VALUES ('6a8471f211600f6c6a8d76f096552e78', 'test02');


执行搜索:

SELECT * FROM "TEST" where USER_ID not in (1000)

报错:

SELECT * FROM "TEST" where USER_ID not in (1000)

> ORA-01722: invalid number

> Time: 0.016s


百度了一下,错误一般是类型转换的时候出错,上面的SQL应该就是number类型转换的时候出错。


查找USER_ID的所有不同值,发现其中有一个值不是数字

SELECT DISTINCT(USER_ID) from TEST


select


解决方法:

1、如果这条数据是非必要数据,可以删除

2、因为表定义字段类型为VARCHAR2,使用字符串匹配:

SELECT * FROM "TEST" where USER_ID not in ('1000')


延伸:

oracle隐式转换

1、“=”号,比较符(not in等)两边的类型是否相同

2、如果“=”号两边的类型不同,尝试的去做转换

3、在转换时,要确保合法合理。不合法则转换异常。


隐式数据类型转换

(1)varchar2变长/char定长——>number,例如:'123'——>123

(2)varchar2/char——>date,例如:'25-4月-15'——>'25-4月-15'

(3)number——>varchar2/char,例如:123——>'123'

(4)date——>varchar2/char,例如:'25-4月-15'——>'25-4月-15'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容