ORA-01722: invalid number 異常【我改】


 

我的情況是,在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM