记一次SQL语句编写不规范引起的小问题(where条件varchar自动转number)

     昨天有现场维护的报告说有一个系统的许多功能都报错了,现像是页面显示了一半,然后就报了一堆错误。由于现场维护的技术不高,说不清是什么错,所以根据页面能正常显示内容,猜出是一个下拉列表,从代码表里生成下拉数据时出的错,因为许多功能都要显示这个下拉列表所以都是相同的错误。

    没说的,赶紧看这个下拉列表的SQL是怎么写的。一看才知道问题所在,这个代码表中存储代码的列用的varchar类型,存储的内容都是数字是1~8,昨天加了一个英文字母的代码,当然这并不是问题所在,问题是那个下拉列表的查询语句,写的where xh<4,这样当该字段里面全是数字时,oracle会自动将字段内容转换成数字进行查询,但由于昨天新加了一个英文字母的值,所以就报了“无效数字”的错误。
问题找到了,将所有的xh<4全部改成 xh in ('1','2','3')即解决了问题,当然用xh<'4'也行。

   问题虽然很快解决了,但还是要总结一下,oracle虽然为我们提供了一些便利,比如可自动将条件中的数字转换成字符串,或将字符串转换成数字,但这种隐性的转换却给系统的扩展和维护埋下了隐患,尤其是一些手工维护的代码表,本来没有什么特别的规则,就是一个编号,无法预期存储的内容。所以对于number的字段用大于,小于的判断不会有问题,因为数据库里有约束,肯定是数字,但对于varchar类型的字段用就有问题了,所以虽然有些时间sql语句可以执行,但规范的编写方式可以使程序更健壮。

猜你喜欢

转载自blog.csdn.net/hereyouare/article/details/6046931
今日推荐