首页 > 代码库 > ORACLE 尽量不使用隐式转换

ORACLE 尽量不使用隐式转换

/*************************************************
一、主题:ORACLE 尽量不使用隐式转换

类型转换的两种方式:显示类型转换(Explicit) 自动类型转换(Implicit)

*************************************************/

=============================================================================
1.1.显示转换可读性更强;
    SELECT TO_DATE(‘1900-01-01‘,‘YYYY-MM-DD‘) FROM DUAL;--正确

--对比
    SELECT TO_DATE(SYSDATE,‘YYYYMMDD‘) FROM DUAL;--报错:无效的月份

    ALTER SESSION SET NLS_DATE_FORMAT=‘YYYYMONDD‘;

    SELECT TO_DATE(SYSDATE,‘YYYYMMDD‘) FROM DUAL;--此时正确:2014-6-26

--这个修改, 仅仅 修改本次登录的情况。不修改别的会话的。

1.2.自动类型转换对性能产生不好的影响
--
    CREATE TABLE TEST1
    (  
        ID   NUMBER(1) NOT NULL PRIMARY KEY,
        NAME VARCHAR(10)
    );
    CREATE unique INDEX IDX_TEST1 ON TEST1(NAME);
   
    INSERT INTO TEST1 VALUES(0,‘0‘);
    INSERT INTO TEST1 VALUES(1,‘1‘);
    INSERT INTO TEST1 VALUES(2,‘2‘);
    INSERT INTO TEST1 VALUES(3,‘A‘);
    INSERT INTO TEST1 VALUES(4,‘B‘);
    INSERT INTO TEST1 VALUES(5,‘a‘);  
    INSERT INTO TEST1(ID)  VALUES(7);           
--   
    SELECT * FROM TEST1 WHERE NAME = 1;--
    /*  虽然会报错,但是执行计划可以查看
        执行计划:查看没有走索引,可能会误导人
        SELECT STATEMENT, GOAL = ALL_ROWS   2 1 20
                 TABLE ACCESS FULL SYS TEST1 2 1 20
    */
    SELECT * FROM TEST1 WHERE NAME = ‘1‘;             
    /*执行计划:走索引
    SELECT STATEMENT, GOAL = ALL_ROWS   0 1 20
    TABLE ACCESS BY INDEX ROWID SYS TEST1 0 1 20
         INDEX UNIQUE SCAN SYS IDX_TEST1 0 1 
    */
   
1.3.自动转换依赖于上下文,一旦上下文改变,原来的程序可能就不能运行。
1.4.ORACLE的版本(自动类型转换规则、算法、)变动也可能导致自动类型转换出现问题。
1.5.自动类型转换与显示转换的时间差不多,最好的办法是避免转换,
    而且左值(column)最好不要进行类型转换,一般都是转换右值(Value)。

  日期为例:  TO_CHAR(DATECOL)=‘DATESTRING‘ ,  错误的写法,会导致索引失效;
 
  改为下面这样,才是符合预期的,
  DATECOL = TO_DATE(DATESTRING,‘YYYY-MM-DD‘)
 
=============================================================================