oracle不能隐式转换,ORACLE 尽量不使用隐式转换

本文探讨了在Oracle数据库中尽量避免隐式类型转换的原因,包括提高代码可读性、避免性能问题、确保上下文稳定性和应对版本变化。通过示例展示了显示转换(Explicit)和自动转换(Implicit)的区别,强调了转换右值而非左值的重要性,并给出了正确的日期比较示例。建议开发者遵循显示转换原则以优化数据库操作。
摘要由CSDN通过智能技术生成

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

一、主题: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‘)

=============================================================================

原文:http://www.cnblogs.com/zihuancc/p/3811911.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值