共计 1169 个字符,预计需要花费 3 分钟才能阅读完成。
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
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/135651.htm