1. 首页 > ITPUX技术网 > 正文

隐式转换错误:ORA-01722: invalid number

oracle数据库有to_number和to_char的隐式转换。
实验如下:
mailto:SYS@192.168.80.100:1521/orcl]SYS@192.168.80.100:1521/orcl > select * from test;
ID NAME
———- ——————–
1 haohao
1 1

mailto:SYS@192.168.80.100:1521/orcl]SYS@192.168.80.100:1521/orcl > desc test
Name Null? Type
—————————————– ——– —————————-
ID NUMBER(2)
NAME VARCHAR2(20)
打开执行计划,并执行一个有where条件的select语句如下:
mailto:SYS@192.168.80.100:1521/orcl]SYS@192.168.80.100:1521/orcl > set autot trace exp
[email]SYS@192.168.80.100[/email]:1521/orcl > select * from test where name=1;
Execution Plan
———————————————————-
Plan hash value: 1357081020
————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 1 | 25 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TEST | 1 | 25 | 2 (0)| 00:00:01 |
————————————————————————–
Predicate Information (identified by operation id):
—————————————————
1 – filter(TO_NUMBER(“NAME”)=1)
从上面的执行计划可以看出Oracle数据库对name列进行了to_number的隐式转换,但是这条select语句会报错如下:
[email]SYS@192.168.80.100[/email]:1521/orcl > select * from test where name=1;
select * from test where name=1
*
ERROR at line 1:
ORA-01722: invalid number
但是给条件的值加上单引号就不会报错
[email]SYS@192.168.80.100[/email]:1521/orcl > select * from test where name=’1′;
ID NAME
———- ——————–
1 1
原因:因为test的name列中有有数字也有字符,oracle处理where name=1的时候是对name进行to_number的隐式转换,但是name列有个值是“haohao”,由此而报错

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息