程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> OracleORA-01722: invalid number---表連接問題,invalidnumber

OracleORA-01722: invalid number---表連接問題,invalidnumber

編輯:Oracle教程

OracleORA-01722: invalid number---表連接問題,invalidnumber


select
ext.org_channel_type as ORG_CHANNEL_TYPE
from channel.channel_pub_info i
left join channel.sec_organize_ext ext
on i.channel_id = ext.organize_id
left join channel.cm_bs_static_data a
on a.code_value = ext.org_channel_type
and a.code_type = 'FIRST_ORG_TYPE'
where 1 = 1
AND ORG_CHANNEL_TYPE='80002'

昨天下午執行這條語句一直報OracleORA-01722: invalid number,以為是ORG_CHANNEL_TYPE='80002'的問題,改成ORG_CHANNEL_TYPE=80002後還是報這個錯。而改成ORG_CHANNEL_TYPE='80009'就不會報錯,只是查不出數據,因為80009這個數據沒有。

原因是:channel.cm_bs_static_data的code_value 是varchar2類型,而channel.sec_organize_ext.org_channel_type是number類型,Oracle會從channel.cm_bs_static_data表中檢索所有的code_value ,這樣裡面就有非數字的code_value ,Oracle在比較varchar與number時,會采用to_number(code_value )=ext.org_channel_type,所以會報OracleORA-01722: invalid number的錯誤。改成a.code_value = CAST(ext.org_channel_type AS varchar2(20))後,對ext.org_channel_type進行先轉varchar再比較就可以了。

在這兒,有人就會問了,那改成ORG_CHANNEL_TYPE='80009'就不會報錯?是為什麼?

原因是:80009在channel.sec_organize_ext中就不存在,所以不會去執行left join channel.cm_bs_static_data a
on a.code_value = ext.org_channel_type
and a.code_type = 'FIRST_ORG_TYPE',也就不會檢索code_value ,所以不會報錯。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved