Welcome 微信登录

首页 / 数据库 / MySQL / ORA-01722: invalid number---Oracle表连接问题

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"在执行这条语句一直报Oracle ORA-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 ,所以不会报错。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址