阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ORA-01722: invalid number—Oracle表连接问题

169次阅读
没有评论

共计 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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1169字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中