oracle数据类型及其隐式转换

oracle有三种最基本的数据类型,即字符型、数值型、日期型。 
oracle提供的单行函数中,针对不同的数据类型,提供大量实用的函数,同时提供一系列数据类型转换函数,如下:

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

数字->字符型的可用格式


格式元素


元素说明


格式


数字


字符结果


9


数字宽度


9999


12


12


0


显示前面的零


09999


0012


00012


.


小数点的位置


09999.999


030.40


00030.400


D


小数点分隔符的位置(默认为句点)


09999D999


030.40


00030.400


,


逗号的位置


09999,999


03040


00003,040


G


组分隔符的位置(默认为逗号)


09999G999


03040


00003,040


$


美元符号


$099999


03040


$003040


L


当地货币


L099999


03040


GBP003040如果nls_currency设置为GBP


MI


表示负数的减号的位置


99999MI


-3040


3040-


PR


包围在括号内的负数


99999PR


-3040


<3040>


EEEE


科学计数法


99.99999EEEE


121.976


1.21976E+02


U


Nls_dual_currency


U099999


03040


CAD003040如果nls_dual_currency设置为CAD


V


乘以10n次(n是V之后9的数量)


9999V99


3040


304000


S


前面加上+或者-


S999999


3040


+3040

日期->字符型的可用格式(示例日期:02-JUN-1975)


格式说明


说明


结果


Y


年的最后一位


5


YY


年的最后两位


75


YYY


年的最后三位


975


YYYY


四位数字表示的年


1975


RR


两位数字表示的年


75


YEAR


区别大小写并用英语拼写的年


NINETEEN SEVENTY-FIVE


MM


两位数表示的月


06


MON


月的三个字母缩写


JUN


MONTH


区分大小写并用英语拼写的月


JUNE


D


星期几


2


DD


月的两位数日(即是本月的第几天)


02


DDD


年的日


153


DY


星期的三个字母缩写


MON


DAY


区分大小写并用英语拼写的星期


MONDAY

其他不常用的格式掩码

演示数据:24-SEP-1000 BC


格式元素


说明


结果


W


月的周数


4


WW


年的周数


39


Q


年的季度


3


CC


世纪


10


S preceding CC,YYYY,YEAR


如果日期是BC,那么减号就在结果之前


-10,-1000或者-ONE THOUSAND


IYYY,IYY,IY,I


分别表示4,3,2,1为ISO日期


1000,000,00,0


BC,AD,B.C. and A.D.


J


儒略日—从公元前4713年12月31日开始的天数


1356075


IW


ISO标准周(1到53)


39


RM


用罗马数字表示的月


IX

时间组件的日期格式掩码

演示数据:27-JUN-2010 21:35:13


格式元素


说明


结果


AM,PM,A.M.和P.M.


子午线指示器


PM


HH,HH12,HH24


一天的小时,1-12时和0-23时


09,09,21


MI


分(0-59)


35


SS


秒(0-59)


12


SSSSS


午夜之后的秒(0-86399)


77713

其他日期格式掩码


格式元素


说明和格式掩码


结果


-/.,?#!


标点符号:’MM.YY’


09.08


“any character literal”


字符值:’”Week” W “”of” Month’


Week 2 of September


TH


位置或者序数文本:’DDth”of”Month’


12TH of September


SP


拼写出数字:’MmSP Month YYYYSP’


Nine September Two Thousand Eight


THSP or SPTH


拼写出位置或者序数:’hh24SpTh’


Fourteenth

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-12-21 06:44:42

oracle数据类型及其隐式转换的相关文章

JavaScript的数据类型的隐式转换

什么是弱类型语言?计算机语言的类型可以分为强类型和弱类型两种. 二者之间的区别,就在于计算时,不同类型数据是否可以透明的隐式转换.如果一个语言可以隐式转换它的所有类型,那么它的变量.表达式等在参与运算时,即使类型不正确,也能通过隐式转换来得到正确的类型,这样的语言就属于弱类型语言. 与此相对,强类型语言的类型之间不一定有隐式转换. 弱类型相对于强类型来说,类型检查更不严格,比如允许变量类型的隐式转换,允许强制类型转换等等,而强类型语言一般不允许这么做.一.1+"2"+"2&q

[2016-02-08][javascript][数据类型的隐式转换]

转换成布尔类型 undefined -> false null -> false 0|0.0 -> false NaN -> false 长度为0的字符串(空字符串) -> false\ 其他对象->true 转换成数值类型 undefined -> NaN null -> 0 true -> 1 false -> 0 字符串 内容为数字->数字 非数字 -> NaN 其他对象 ->NaN 转换成字符串类型 null - >

关于ORACLE隐式转换后性能问题

SELECT TM.MONEY_CODE FROM T_CONTRACT_MASTER T,T_MONEY TM WHERE T.MONEY_ID = TM.MONEY_ID AND T.POLICY_CODE = ? 问题出现: 今儿生产代码性能扫描这段脚本被揪出来了,原因是这玩意儿执行时间过长,把后面的代码兄弟都给堵住了,然后发现这家伙在做全表扫,一 开始纳闷,这不对啊,T.POLICY_CODE上面明明白白的建这索引呢,咋就能全表扫呢,既然会全表扫导致性能下降,那为什么开发环境没有 发现问

SQL Server有意思的数据类型隐式转换问题

写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CREATE TABLE TEST (   ID    INT,   GOOD_TYPE  VARCHAR(12),   GOOD_WEIGHT NUMERIC(18,2) )   INSERT INTO dbo.TEST VALUES( 1, 'T1',1.27) SELECT  GOOD_TYPE,

Scala 中的隐式转换 implicit

Scala语言中的隐式转换是一个十分强大的语言特性,主要可以起到两个作用: 一.自动进行某些数据类型的隐式转换 String类型是不能自动转换为Int类型的,所以当给一个Int类型的变量或常量赋予String类型的值时编译器将报错.所以,一下语句是错误的. val x: Int = "100" 如果需要将一个字符串类型的整形数值赋给Int,比如使用String.toInt方法,例如: v al x: Int = "100".toInt 如果想让字符串自动转换为整形,

编写高质量代码——提防隐式转换带来的麻烦

在C/C++ 语言,允许在不同类型的数据之间进行某一操作或混合操作,如果类型不同,则要将数据转换成相同的数据类型(隐式转换和显示转换). ========================= 隐式转换主要发生的情形: ▉基本类型之间的隐式转换 C/C++ 中规定的两个通用转换原则: 1)为防止精度损失,类型总是被提升为较宽的类型. 2)所有含有小于整数类型的算术表达式在计算之前其类型都被转换成整形. 对于C++最直接的害处是:可能导致 重载函数 产生二义性. 例如: void Print(int

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

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

javascript数据类型隐式转换

一.函数类 isNaN() 该函数会对参数进行隐式的Number()转换,如果转换不成功则返回true; alert() 输出的内容隐式的转换为字符串 二.运算符类 1.算数运算符 -  *   /  % 如果操作数不是数值,将会隐式的调用Number()函数,按照这个函数的转换规则进行转换,如果转换不成功,整个表达式返回NaN + 如果操作数都是数值,然后进行相加 任何数据类型和字符串相加,都会隐私的调用他们的toString()方法,然后返回他们拼接的结果. 如果操作数都是布尔值,那么进行N

Oracle的隐式转换

都说Oracle存在NUMBER和VARCHAR2类型的隐式转换,严格意义上需要避免,但为何需要避免,从下面的实验进行验证. 1. 创建测试表和索引 create table tn (id number, name varchar2(1)); create index idx_tn on tn (id); create index idx_tn on tn (name); 分别对NUMBER类型的id字段,VARCHAR2类型的name字段创建索引. 2. 查看VARCHAR2->NUMBER的