隐式转换潜在的问题
概述:
在开发自测的过程中,执行存储过程的时候执行类似下面语句正常,但是在集体的测试环境中会出错。
SELECT * FROM students WHERE sno = 101;
注:sno 字段是 varchar2 类型。
产生原因:
看到上面的字段类型,估计很多人都明白过来了,但是我这还是记录一下,避免以后傻逼。
因为表中 sno 字段是varchar2 类型,而 101 是 number 类型,所以在执行过程中Oracle会默认将 sno 字段的数据全部转换为 number 类型,当 sno 字段的字段值中存在不能转换的数据时,就会报错。
但是我们在自测的时候,往往数据没有顾忌得那么全面,导致不能够及时发现这个错误。
解决方法:
将语句修改下,使得等号右边的值为 varchar2 类型,这样就不会有隐式转换了。
SELECT * FROM students WHERE sno = '101';
注意:
隐式转换的等价式:
SELECT * FROM students WHERE to_number(sno) = 101
而不是将 101 转换成字符型。
并且隐式转换会导致执行计划变化,本来能走索引的只能走全表扫描。
在定义变量的时候,最好用 table.column%type 这种方式来定义变量。