ORA-01722: invalid number

本文分析了Oracle中ORA-01722错误的原因,并通过实验验证了当VARCHAR2类型字段被不当用作数字比较时会触发此错误。展示了如何复现错误及排查方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天开发遇到一个问题,两个不同的用户,下面都有一张表,表的结构一样,数据不一样,列是varchar2类型的,a用户执行查询select xx from xx where xx=1;可以出结果,b用户查询自己的表就报错ORA-01722: invalid number。开发怀疑是用户的权限不一样导致的。


分析:这个应该跟权限没有关系,如果某一个列定义的是varchar2字符串类型的,查询的时候使用了where xxx=1,让列名等于一个数字,那么,如果这个列里面都是数字,那么不报错,如果列里面只要有一个是非数字的,则报错。
因为,oracle使用了隐式的转换,to_number(xxx)=1,如果xxx列里面有不能转换为数字的,则报错。
下面进行验证
SQL> create table gw1(name varchar2(5));
Table created.
SQL> insert into gw1 values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from gw1 where name=1;
NAME
----------
1
SQL> truncate table gw1;
Table truncated.
SQL> insert into gw1 values('a');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from gw1 where name=1;
select * from gw1 where name=1
                        *
ERROR at line 1:
ORA-01722: invalid number
SQL> insert into gw1 values(1);  
1 row created.
SQL> insert into gw1 values(2);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from gw1 where name=1;
select * from gw1 where name=1
                        *
ERROR at line 1:
ORA-01722: invalid number


SQL> explain plan for select * from gw1 where name=1;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3401378285
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     4 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| GW1  |     1 |     4 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(TO_NUMBER("NAME")=1)----------------------------


然后检查两个用户的两个表,发现不报错的用户的表里面的字段都是数字,而报错的用户表里面的字段有字母。
































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值