我负责维护一个钢铁企业的生产管理系统,程序已经上线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以上,就会报错,改变条件顺序就不会报。
百思不得其解,愿达人指教。谢谢!
该厂有两种钢坯产品(方坯,实际宽度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以上,就会报错,改变条件顺序就不会报。
百思不得其解,愿达人指教。谢谢!
解决方案 »
- 请高手优化以下SQL!!!
- 再次提问:高级问题:当一个数据库有多个用户,其中一个用户正查询了某表的一条记录到客户端,另外的用户是如何判断此记录正被用户使用???
- 导入数据的时候报ora-03120错误,怎么解决?
- 请问inline view是什么意思
- 请教:如何导数据最快
- oracle8.1.6的安装问题
- 急,编译的时候出错
- 我的机器修改了域名,怎样把原来的oracle数据库节点的后缀名改成新的域名(内详)
- 如何用UTL_FILE.FOPEN打开客户端的文件?急!
- oracle存储过程读取txt
- RANK的时候报缺失右括号(大虾帮忙看下)
- 急,我的Oracle10g没有Pro*C/C++编译器,该如何安装?谢谢?
最小宽度没有约束,改变条件顺序可以查出记录来,值加单引号也可以查出来,
select 密度 from 密度表 where 铸机号=1 and 产品名称=板坯 and 最小宽度 <=749 and 最大宽度>=1000; 也可以查出来,不报错,但没有符合条件的记录
语句确实没有错,而且运行了多年,突然就不行了,所以觉得奇怪
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; 两条语句通过是因为已经将错误的记录过滤掉了