C/C++教程

oracle数字和字符的隐式自动转换 ORA-01722: invalid number ORA-01722: 无效数字

本文主要是介绍oracle数字和字符的隐式自动转换 ORA-01722: invalid number ORA-01722: 无效数字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
--表结构
create table A
(
   NAME VARCHAR2(100),
   AGE NUMBER,
   ID NUMBER
)
/

一、新增、修改时的隐式转换
--新增、修改时的隐式转换
insert into A(ID,AGE,NAME) values (1,2,3);--数字->字符:会自动将数字3转换为字符
insert into A(ID,AGE,NAME) values ('4','5',6);--字符->数字:会自动将字符'4'、'5'转换为数字,如果不是数字,转换则会报错 ORA-01722: 无效数字
update A set NAME=33 where ID=1;--数字->字符:会自动将数字33转换为字符
update A set AGE='55' where ID=4;--字符->数字:会自动将字符'55'转换为数字,如果不是数字,转换则会报错 ORA-01722: 无效数字

二、where条件中的隐式转换
--where条件中的隐式转换
--先新增一条数据
insert into A(ID,AGE,NAME) values (7,8,'zhangsan');
--查询
select * from A where NAME=99;--按照前面的自动隐式转换知识,可能会觉得这里会将99转换为字符串查询。实际上执行报错:ORA-01722: 无效数字
--可以用执行计划来看看这条语句执行的过程
explain plan for select * from A where NAME=99;
select * from table(dbms_xplan.display);

--可以看到这条语句实际上变成了:select * from A where TO_NUMBER("NAME")=99;
--由于表中存在name字段为非数字的数据(zhangsan),使用TO_NUMBER转换当然会报错
--如果此时表中数据name字段的值都为数字的话,那上面的语句是不会报错的,这是一个比较隐蔽的问题,在特定条件下才会出现报错。
--当where条件中涉及到数字和字符的转换时,等号两边一边为数字、一边为字符,可以将数字转换为字符,也可以将字符转换为数字
--而oracle隐式转换采取的方式是将等号两边中字符的一方转换为数字。
select * from A where AGE='99a'; --> select * from A where AGE=TO_NUMBER('99a');

 

这篇关于oracle数字和字符的隐式自动转换 ORA-01722: invalid number ORA-01722: 无效数字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!