--表结构 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');