请教一条非常奇怪的SQL语句问题

时间:2021-07-03 11:40:13
我负责维护一个钢铁企业的生产管理系统,程序已经上线2年,一直运行正常,今天却出了非常奇怪的故障,请大侠帮忙解释一下。
该厂有两种钢坯产品(方坯,实际宽度400、板坯实际宽度1000),板坯产品突然没有理论重量(理论重量计算为密度*体积),方坯却正常,但是两种产品其实都是一段代码,排除了各种因素后,打断点进行跟踪,发现一条SQL查询语句报错,该SQL查询语句是查询密度表。
表的结构大致如下:
产品名称(Varchar2)   铸机号(Varchar2)   最小宽度(num)    最大宽度(num)    密度
方坯                    2                   350              450              7850
板坯                    1                   750              1300             7850
抓出来的语句为:
select 密度 from 密度表 where  铸机号=1 and 产品名称=板坯 and 最小宽度<=1000 and 最大宽度>=1000;
语句无法执行,报错:ORA-01722: 无效数字错误。
执行方坯的语句:
select 密度 from 密度表 where 铸机号=2 and 产品名称=方坯 and 最小宽度<=400 and 最大宽度>=400;
却一切正常。
执行下面的语句也一切正常:
select 密度 from 密度表 where  产品名称=板坯 and 铸机号=1 and 最小宽度<=1000 and 最大宽度>=1000;
再次执行语句:
select 密度 from 密度表 where  铸机号=1 and 产品名称=板坯 and  最小宽度<=749 and 最大宽度>=1000;
也一切正常,但是只要最小宽度<= 750或750以上,就会报错,改变条件顺序就不会报。
百思不得其解,愿达人指教。谢谢! 

6 个解决方案

#1


铸机号不是数字型的,但程序生成SQL语句没有加单引号,加上也不会报错。但是直接执行select 密度 from 密度表 where 铸机号=1语句也不会报错。最奇怪的是程序已经正常运行N久,也没有修改,外部条件没变,突然就有问题,难道是人品问题

#2


错误号报报

#3


最小宽度是否定义了什么约束?你改变条件顺序是否没有记录查询出来?

#4


看似没有错误啊,请LZ别错误信息贴出来

#5


报错:ORA-01722: 无效数字错误;
最小宽度没有约束,改变条件顺序可以查出记录来,值加单引号也可以查出来,
select 密度 from 密度表 where 铸机号=1 and 产品名称=板坯 and 最小宽度 <=749 and 最大宽度>=1000; 也可以查出来,不报错,但没有符合条件的记录
语句确实没有错,而且运行了多年,突然就不行了,所以觉得奇怪

#6


问题已经解决,检查有一条数据的铸机号的值错误,应该为(1,2,3,4)之一,却被工艺人员错误的维护为“stb”,这条记录的最小宽度值为750;
select 密度 from 密度表 where 产品名称=板坯 and 铸机号=1 and 最小宽度 <=1000 and 最大宽度>=1000;这条语句报错是因为Oracle从右向左读取条件,错误的铸机号当然转换错误;
select 密度 from 密度表 where 铸机号=1 and 产品名称=板坯 and 最小宽度 <=1000 and 最大宽度>=1000 和 select 密度 from 密度表 where 产品名称=板坯 and 铸机号=1 and 最小宽度 <=749 and 最大宽度>=1000; 两条语句通过是因为已经将错误的记录过滤掉了

#1


铸机号不是数字型的,但程序生成SQL语句没有加单引号,加上也不会报错。但是直接执行select 密度 from 密度表 where 铸机号=1语句也不会报错。最奇怪的是程序已经正常运行N久,也没有修改,外部条件没变,突然就有问题,难道是人品问题

#2


错误号报报

#3


最小宽度是否定义了什么约束?你改变条件顺序是否没有记录查询出来?

#4


看似没有错误啊,请LZ别错误信息贴出来

#5


报错:ORA-01722: 无效数字错误;
最小宽度没有约束,改变条件顺序可以查出记录来,值加单引号也可以查出来,
select 密度 from 密度表 where 铸机号=1 and 产品名称=板坯 and 最小宽度 <=749 and 最大宽度>=1000; 也可以查出来,不报错,但没有符合条件的记录
语句确实没有错,而且运行了多年,突然就不行了,所以觉得奇怪

#6


问题已经解决,检查有一条数据的铸机号的值错误,应该为(1,2,3,4)之一,却被工艺人员错误的维护为“stb”,这条记录的最小宽度值为750;
select 密度 from 密度表 where 产品名称=板坯 and 铸机号=1 and 最小宽度 <=1000 and 最大宽度>=1000;这条语句报错是因为Oracle从右向左读取条件,错误的铸机号当然转换错误;
select 密度 from 密度表 where 铸机号=1 and 产品名称=板坯 and 最小宽度 <=1000 and 最大宽度>=1000 和 select 密度 from 密度表 where 产品名称=板坯 and 铸机号=1 and 最小宽度 <=749 and 最大宽度>=1000; 两条语句通过是因为已经将错误的记录过滤掉了