Oracle隐式类型转换

详细连接:http://blog.163.com/lsj_start/blog/static/17826443920111112103716524/

http://blog.itpub.net/29324876/viewspace-1096741/   (用explain查看隐式转换)

oracle有三种最基本的数据类型,即字符型、数值型、日期型。同时提供类型转换函数

1)to_char
    数值、日期->字符型
   
语法:to_char(num|date,[format
mask],[nls_parameters])
    参数:num|date
待转换的数值或者日期
            format
mask:可选参数

2)to_date

字符值->日期值 语法:to_date (string,[format mask],[nls_parameters]) 参数:string 待转换的字符值             format mask:可选参数

      格式掩码同to_char转换为date时相同。

备注:转换时要根据给定的string设定正确的格式掩码,否则

      Ora_01840:input value is not long enough for date format.

      Ora_01862:the numeric value does not match the length of the format item.

3) to_number

字符值->数字值 语法:to_number (string,[format mask],[nls_parameters]) 参数:string 待转换的字符值             format mask:可选参数

      格式掩码同to_char转换为number时相同。

备注:如果使用较短的格式掩码就会返回错误。

       例如: to_number(123.56,’999.9’)返回错误。



在oracle中,如果不同的数据类型之间关联,如果不显式转换数据,则它会根据以下规则对数据进行隐式转换

1) 对于INSERT和UPDATE操作,oracle会把插入值或者更新值隐式转换为字段的数据类型。

假如id列的数据类型为number

update t set id=‘1‘; -> 相当于 update t set id=to_number(‘1‘);

insert into t(id) values(‘1‘) -> insert into t values(to_number(‘1‘));

2) 对于SELECT语句,oracle会把字段的数据类型隐式转换为变量的数据类型。    如假设id列的数据类型为varchar2

select * from t where id=1; -> select * from t where to_number(id)=1;

但如果id列的数据类型为number,则

select * from t where id=‘1‘; -> select * from t where id=to_number(‘1‘);(参考下文)

3) 当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型。

如假设id列的数据类型为number

select * from t where id=‘1‘; -> select * from t where id=to_number(‘1‘);

4) 当比较字符型和日期型的数据时,oracle会把字符型转换为日期型。

如假设create_date为字符型,

select * from t where create_date>sysdate; -> select * from t where to_date(create_date)>sysdate;(注意,此时session的nls_date_format需要与字符串格式相符)

假设create_date为date型,

select * from t where create_date>‘2006-11-11 11:11:11‘; -> select * from t where   create_date>to_date(‘2006-11-11 11:11:11‘); (注意,此时session的nls_date_format需要与字符串格式相符)

5) 如果调用函数或过程等时,如果输入参数的数据类型与函数或者过程定义的参数数据类型不一直,则oracle会把输入参数的数据类型转换为函数或者过程定义的数据类型。

如假设过程如下定义 p(p_1 number)

exec p(‘1‘); -> exec p(to_number(‘1‘)); 6)

赋值时,oracle会把等号右边的数据类型转换为左边的数据类型。

如 var a number a:=‘1‘; - > a:=to_number(‘1‘);

7) 用连接操作符(||)时,oracle会把非字符类型的数据转换为字符类型。

select 1||‘2‘ from dual; -> select to_char(1)||‘2‘ from dual;

8) 如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算,则oracle会将字符类型的数据转换为合适的数据类型,这些数据类型可能是number、date、rowid等。

如果CHAR/VARCHAR2 和NCHAR/NVARCHAR2之间作算术运算,

则oracle会将她们都转换为number类型的数据再做比较。

9) 比较CHAR/VARCHAR2 和NCHAR/NVARCHAR2时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集。

简单总结:

比较时,一般是字符型转换为数值型,字符型转换为日期型

算术运算时,一般把字符型转换为数值型,字符型转换为日期型

连接时(||),一般是把数值型转换为字符型,日期型转换为字符型

赋值、调用函数时,以定义的变量类型为准。

时间: 2024-08-30 01:22:36

Oracle隐式类型转换的相关文章

【转载】关于oracle隐式转换以及转换时的优先级问题

以下转载自:http://blog.itpub.net/29324876/viewspace-1096741/ Oracle中对不同类型的处理具有显式类型转换(Explicit)和隐式类型转换(Implicit)两种方式,对于显式类型转换,我们是可控的,但是对于隐式类型转换,当然不建议使用, 因为很难控制,有不少缺点,但是我们很难避免碰到隐式类型转换,如果不了解隐式类型转换的规则,那么往往会改变我们SQL的执行计划,从而可能导致效率降低或其它问题.   1.1  隐式转换发生场景 1.对于INS

Javascript显示和隐式类型转换

1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所有对象都拥有转换为字符串的能力. 比如一个Number转换为String: var n = 1; n.toString(); // '1' toString接受一个参数指定进制,默认为10. 可以利用这个参数生成包括字母和数字的随机字符串: Math.random().toString(36).su

More Effective C++ 条款21 利用重载技术避免隐式类型转换

1. 正如条款19和条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换. 2. 考虑以下类UPInt类用于处理高精度整数: class UPInt{ public: UPInt(); UPInt(int value); ... }; const UPInt operator+(c

C++的隐式类型转换

C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处:<Effective C++> lostmouse大人翻译 class TestInt{ public:    int GetData()const{ return i;};    TestInt(int ii):i(ii){}; //构造函数 private:    int i; }; voi

为何要防止隐式类型转换

让编译器进行隐式类型转换所造成的弊端要大于它所带来的好处,所以除非你确实需要,不要定义类型转换函数. 隐式类型转换的缺点:它们的存在将导致错误的发生.例如:class Rational {public:  ...  operator double() const;                   // 转换Rational类成double类型};在下面这种情况下,这个函数会被自动调用:Rational r(1, 2);                            // r 的值是1

scala学习手记35 - 隐式类型转换

先来看一下下面的内容: 2 days "ago" 5 days "from_now" 如上的内容具体应该是什么呢?不过怎么看也不像是代码.不过既然是在学代码,拿不是代码的东西出来做什么! 非要强说是代码的话,那么执行起来肯定是要报错的--因为scala的Int和RichInt,以及Integer中都没有days这样的方法: 如果说不是代码的话,那么scala中的to或until本来看起来也不像代码: 2 to 6 2 until 7 现在剩下的就是怎么为整型值添加上

JS 基础1: 理解number 数据类型 和隐式类型转换

1, Javascript only has one type of numberic data, named "number". You can see this reflected in the behavior of the typeof operator, which classifies intergers and floating-point numbers alike simply as numbers: typeof 10; // "number"

有趣的JavaScript隐式类型转换

JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加: 3 + true; // 4 结果是一个数值型!如果是在C或者Java环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只有少数情况下,错误类型

「译」JavaScript 的怪癖 1:隐式类型转换

原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 [此贴子是 javascript 的 12 个怪癖(quirks) 系列的第一篇.] JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型. 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转