隐式转换潜在的问题

隐式转换潜在的问题

概述:

在开发自测的过程中,执行存储过程的时候执行类似下面语句正常,但是在集体的测试环境中会出错。

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 这种方式来定义变量。

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/86546060