• 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时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集。

    简单总结:

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

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

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

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

  • 相关阅读:
    如何量化用户体验UE(How To Quantify The User Experience)[网摘]
    完美简单的loading外部文件.
    FLV播放器 源码二例
    让你的网站上实时更新各大网站的新闻
    我的第一次涂鸦
    Alan Cooper 的交互设计观 [网摘]
    把视频文件自动的在服务器端转换成FLV文件的FFMPEG的编译方法[网摘]
    ASP.NET 页面生命周期
    ASP.NET MVC Area操作
    浅谈DataAnnotations
  • 原文地址:https://www.cnblogs.com/newRedFlower/p/4484688.html
Copyright © 2020-2023  润新知