错误提示"ORA-01722: 无效数字"一例

遇到用户反馈过来的一例错误提示:
select dutycode,rpttype,rptid
from vRptDuty
where RptId=7 ;
这个语句提示 ORA-01722: 无效数字
如果不加条件
select dutycode,rpttype,rptid
from vRptDuty ;
则语句顺利执行.

看vRptDuty是一个视图,其定义如下:
create or replace view vrptduty as
Select a.RptType, a.RptId, d.DutyCode
from tSysDutyFun d,  tSysFunction c, tRptItem a
Where to_number(c.UniParam) = a.RptId
and d.FunCode = c.FunCode
and c.FunCode like '29______';

关注了涉及的两个表:
tRptItem表的RptId列,字段类型number,不允许空,
tsysfunction表的UniParam列,字段类型varchar2,允许空,其中的值有非数值的
单独执行构成视图的select语句,也是能够查询出结果的,而且,结果中,仅出现UniParam列是数值,并且满足关联条件的行.
将报错的语句,进行视图代码替代之后,语句如下,
select dutycode,rpttype,rptid
from (Select a.RptType, a.RptId, d.DutyCode
      from tSysDutyFun d,  tSysFunction c, tRptItem a
      Where to_number(c.UniParam) = a.RptId
      and d.FunCode = c.FunCode
      and c.FunCode like '29______') V
where RptId=7 ;
按上述测试,此语句应该能顺利执行才是.而结果,却提示 ORA-01722: 无效数字

看来,Oracle编译器对语句的处理,与大家常规的思维还是有差异的.
联想到先前拜读崔华的大作,其中第4章述及SQL查询转换,视图合并等内容.估计是Oracle对语句进行了适当转换,而将外层条件提前施加到内层表,然后再进行关联,遭遇对非数值进行to_number所致.
所以,对不同数据类型的数据共存一个字段中,不是个好习惯!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29512902/viewspace-1364684/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29512902/viewspace-1364684/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值