ORACLE報"ORA-01722:無效數字"的錯誤


一、錯誤類型及描述

1、錯誤類型

 

2、錯誤描述

a、關聯表之后出現“無效數字”

b、日期轉為字符類型出現“無效數字”

c、數字乘以空格出現“無效數字”

(需要特別注意空格字符)

d、表名寫錯出現"無效數字"

 

3、錯誤原因

a、數字不能與非數字字符外的其他字符關聯(NULL除外)

SELECT * FROM (SELECT 1 a FROM DUAL)T1 LEFT JOIN (SELECT 'abd' b,'value' c FROM DUAL)T2 ON T1.A=T2.B

表T1                                      表T2

                 

用T1的A字段與T2的B字段關聯就會出現“無效數字”

SELECT * FROM (SELECT 1 a FROM DUAL)T1 LEFT JOIN (SELECT '10' b,'value' c FROM DUAL)T2 ON T1.A=T2.B

當T2的B字段值為 '10'就不會這樣的問題

因為ORACLE會自動把數字字符串轉為數字,表T2如下

如果不確定某字段是否具有非數字字符串,可以用distinct來查詢,有時候要注意NULL值和空格字符,因為看起來是一樣的,但是點空格字符會發現有空格

 

b、日期字段原本就是varchar2類型,再用TO_CHAR就會出現錯誤

c、數字不能乘以數字字符外的其他字符(NULL除外)

SELECT 5*' ' FROM DUAL;

d、表名是ods.formtable,但是寫成ods._formtable,不小心在前面多加一橫就會出錯。

 

二、解決方法

 1、對於a、c種錯誤原因,當數字與字符串類型的字段進行關聯或者乘除操作時,要注意字符類型應為“數字字符”,或者通過case when 把非數字字符的值改為null

SELECT * FROM (SELECT 1 a FROM DUAL)T1 LEFT JOIN (SELECT 'abd' b,'value' c FROM DUAL)T2 ON T1.A=(case when regexp_like (t2.b,'([^.0-9])+') then null else t2.b end)
SELECT 5*(case when regexp_like (' ','([^.0-9])+') then null end)a FROM DUAL;

 

2、注意查看字段原本類型,如果日期字段原本就是字符類型,通過to_char轉換成字符類型就會出錯,可以通過substr來截取。

3、注意查看表名。


免責聲明!

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



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