遇到用户反馈过来的一例错误提示:
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/