你的位置:首页 > 数据库

[数据库]OracleORA


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