OracleORA-01722: invalid number---表连接问题


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 ,所以不会报错。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2026 CODEPRJ.COM