您好,欢迎访问一九零五行业门户网

Oracle数据类型的隐性转换

欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入 ********************************************************* declare vv varchar2(10):='123'; begin update /*+ rule*/ tt2 set numcol=1 where charcol=vv; end; / rows row source operation --
欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入
*********************************************************
    declare
    vv varchar2(10):='123';
    begin
    update /*+ rule*/ tt2 set numcol=1 where charcol=vv;
    end;
    /
    rows row source operation
  -------  ---------------------------------------------------
    0 update
    0 index range scan idx_char (object id 28748)
    *********************************************************
    rows为0,说明没有行被更新,'123   '与'123'理应为不同的值,这样的结果合理,然而在rbo方式下idx_char索引被使用,可见并没有对charcol进行隐性的转换。
    可是,将char类型字段与字符串常量进行比较呢?
    *********************************************************
    sql> select /*+ rule */ * from tt2 where charcol='123';
    numcol charcol varcharcol
  ---------- ---------- ----------
    1 123 1a
    execution plan
  ----------------------------------------------------------
    0 select statement optimizer=hint: rule
    1 0 table access (by index rowid) of 'tt2'
    2 1 index (range scan) of 'idx_char' (non-unique)
    *********************************************************
    居然有数据返回,并且idx_char 索引被使用,岂不是'123       '与'123'相等,同样的where语句,同样是字符串'123',因为隐性转换产生了不同的逻辑,原来char与字符串常量比较时,隐性将常量按 char的字段类型转换,'123'转换成char(10)则变成了'123    ',看来使用char类型得小心了,两种不同的结果其实就对应着我们在应用开发中将sql放在存储过程中还是放在中间件或前台代码中。
    做了这么多例证,掌握了常用的转换规律后,我们在数据库开发中应该注意些什么呢:
    1、 表结构设计中字段的类型以及数据库代码变量的类型应慎用char类型,采用这种类型的数据必须满足两个条件:1)非空;2)有固定长度。
    2、 规范编码,尽量避免隐性转换,比较中使用相同类型。
    在代码中构造动态sql时,对字符串类型字段的比较中常有这种情况发生,实际上构造的语句是将字符与数字进行比较。
    v_sql:=' ...  where varcharcol='||v_str;
    正确的做法应该是
    v_sql:=' ...  where varcharcol='''||v_str||'''';
    3、 某些标记性或开关意义的字段,取值范围诸如(0,1),(1、2、3)等,尽量使用number,而不要使用varchar2。
    如果where varcharcol='1'误写为 where varcharcol=1将可能造成严重的性能问题,频繁隐性类型转换还可能造成不可预期的ora-06512
    错误,而 where numcol=1 误写为 where numcol='1'则没有太多不利影响
  [1] [2] [3]
其它类似信息

推荐信息