首页 > 代码库 > 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‘)
=============================================================================