我的情況是,在sql中兩個字段相等最為條件時,這兩個字段一個類型是字符串,一個是數字,而字符串類型的字段中有一條記錄不能轉成為數字造成的,解決方法,用 to_char將數字類型的字段轉換為字符串再比較。
轉:
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)----------------------------
然后檢查兩個用戶的兩個表,發現不報錯的用戶的表里面的字段都是數字,而報錯的用戶表里面的字段有字母。
————————————————
版權聲明:本文為CSDN博主「娜然」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/nanaranran/article/details/79670873