oracle中最重要的数值型为number。尽管在实际开发中,可以利用integer来定义列或者变量,但oracle仍然推荐用户统一使用number类型。接下来,本文将说明:
数值型简介
数值型函数
1、oracle中的数值型
oracle中的数值型仅有一种,即为number类型。该类型的使用方法如下:
number [ ( precision [ , scale ])]
其中,precision代表该数值型的精度;而scale则指定小数后的位数,由于precision和scale均为可选,因此,既可以指定number类型的精度,也可以直接使用number类型进行声明。precision的取值范围为1=<prevision<=38;scale的取值范围为-84=<prevision<=127
1.1 如果理解精度
number类型中的精度是指可以标识数据精确度的位数。而数据的精确度,决定于精确到位数。例如:对于数字1235.977来说,当精确到小数点后两位,数据应为12345.98,此时的精度为7,因为共有7位数字对数据的精确度做出贡献。而当精确到小数点前两位,数据应为12300,此时的精度为3,因为共有3个数字对数据的精确度做出贡献---数字仅能以百为单位。
1.2 精度与小数位数
在number类型中,小数位数scale可以为正数,也可以为负数,当scale为负数时,表示将数字精确到小数点之前的位数;当scale为正数时,表示将数字精确到小数点之后的位数;当scale为0时,表示将数字精确到正数。
例子:对于指定了number类型的列或者变量,为期赋值时,应注意不要超过其精度,当超出其精度时,oracle将抛出错误。
num1 为number(5,2)
num2为number(2,5)
num3为number(5,-2)
对于num1,其数据类型用number(5,2)表示,精度为5,精确到小数点后两位,这是最常见的情况,很明显,整数部分不能超过3位。
对于num2,其数据类型为number(2,5),表明其精度为2,实际数据将精确到小数点后第5位,这表明相应的数值必须小于0.000995,如果是将该数字插入到num2中,系统会报错,0.000995利用四舍五入精确到小数点之后第5位,其值为0.00100,此时的精度为3.
将数值0.0009949999999插入到num2中,oracle将可成功执行该操作。0.0009949999999利用四舍五入获得的值为0.00099,该值的精度为2,不会超出number(2,5)所指定的范围.
num3,其数据类型为number(5,-2),要求实际数据精确到小数点之前2位,并且精度不能超过5。
2、oracle中的数值处理
针对数值型,oracle提供了丰富的内置函数进行处理,现将针对这些函数进行简要介绍
2.1 返回数字的绝对值----abs()函数
abs()函数用于返回数值的绝对值。
例如:利用abs()函数返回数值的绝对值。
SQL>select abs(-21.45) from dual;
---------
21.45
2.2 返回数字的四舍五入值---round()函数
round()函数用于返回数字的四舍五入值,该函数的使用语法如下:
round(原数值[, 小数位数])
其中,小数位数可以为正数、负数和0,当小数位数为0时,可以将其省略。
例子 :当小数位数为正数时,表示精确到小数点之后的位数,如下所示
SQL>select round(4.37,1) result from dual;
--------------------
4.4
round(4.37,1)表示将小数4.37利用四舍五入精确到小数点后1位,运算结果为4.4.当小数位数为负数时,表示精确到小数点之前的位数。如下:
SQL>select round(456.37,-1) result dual
------------------
460
当小数位数为0时,后者省略时,表示精确到正数。
2.3 向上取整-----ceil()函数
ceil()函数返回大于等于数值类型参数的最小整数。
例子:演示ceil()函数的使用。
SQL>select ceil(23.45) result from dual;
-----------
24
ceil(23.45)返回大于等于23.45的最小整数24.
同样,ceil()函数的参数还有可能为负数。
SQL>select ceil(-23.45) result from dual;
-------------
-23
2.4 向下取整------floor()函数
与ceil()函数相反,floor()函数用于返回小于等于参数值的最大整数。
例子:演示floor()函数的使用。
SQL>select floor(23.45) result from dual;
----------------
23
SQL>select floor(-23.45) result from dual;
---------------
-24
2.5 取模操作----mod()函数
mod()函数用于返回一个除法表达式的余数。很明显,该函数要求两个参数---被除数和除数,其语法形式如下:
mod(被除数,除数)
例子:演示mod()函数的使用
SQL>select mod(5,2) result from dual;
------------
1
mod(5,2)用于获得5/2的余数,该余数为1.
值得注意的是,在mod()函数中,被除数可以为0,如下所示:
SQL>select mod(5,0) result from dual;
----------
5
当除数为0,时,mod()函数返回的值永远为被除数。
2.6 返回数字的正负性---sign()函数
一个数字是正数、负数还是0,可以通过多个if判断来实现。除此之外,oracle还提供了sign()函数来获得参数的正负性。当参数大于0时,sign()函数返回1;当参数小于0时,sign()函数返回-1;当参数等于0,sign()函数将返回0.
2.7 返回数字的平方根---sqrt()函数
sqrt()函数用于返回数字的平方根,从平方根的意义可以看出,该函数的参数不能小于0.
例子:利用sqrt()函数返回参数的平方根
SQL>select sqrt(4) result from dual;
------------
2
sqrt(4)用于返回数值4的平方根2,如果参数小于0,oracle将抛出错误。
SQL>select sqrt(-4) result from dual;
ORA-01428:argument'-4' is out of range 表示,参数-4超出了有效值范围。
2.8 乘方运算----power()函数
power()函数用于进行乘方运算,该函数有两个参数,第一个参数为乘方运算的底数,第二个参数为乘方运算的指数,其调用方式如下:
power(底数,指数)
例子:利用power()函数进行乘方运算。
SQL>select power(4,3) result from dual;
---------------
64
power(4,3),4为底数,3为指数,power(4,3)用于获得4的3次方,其值为64.
2.9 截取数字-----trunc()函数
trunc()函数用于截取函数,当参数为数字时,trunc()函数将截取部分数字,其工作机制非常类似于round()函数,但是trunc()函数并不进行四舍五入操作,而是直接舍去。该函数的调用语法如下。
trunc(元数值[,小数位数])
例子:利用trunc()函数截取部分数字
当小数位数大于0时,表示截取至原数值的小数点之后的位数。
SQL>select trunc(3.789,2) trunc_result, round(3.789,2) round_result from dual;
TRUNC_RESULT ROUND_RESULT
---------------------- ------------------------
3.78 3.79
trunc(3.789,2) 截取3.789小数点之后两位数字,其值为3.78,;相比之下,round(3.789,2)是利用了四舍五入的方式保留至小数点之后两位数字,其值为3.79.
当小数位数为0,或者小数位数被省略时,trunc()函数将截取元数值的整数部分。
SQL>select trunc(3.789,0) result from dual;
-----
3
SQL>select trunc(3.789) result from dual;
-------
3
2.10 将ASCII码转换为字符----chr()函数
同其他编程语言一样,oracle也提供了讲ASCII码转换为字符的函数。chr()函数仅含有一个函数,chr()函数将该参数翻译为实际字符。
例子:利用chr()函数将ASCII码转换为字符。
SQL>select chr(65) character from dual;
---------------
A
chr()函数的一个典型应用场景为向数据表中插入不宜直接插入的字符。在oracle中,“&”用来进行变量引用。因此当尝试向表中插入的数据含有该符号时,oracle可能会将其解释为变量引用。
SQL>insert into test_char(f_char) valuse('&id=1');
此时,PL/SQL Developer 将给出提示窗口,要求输入变量ID的值,如图:
处理该问题时,当然可以首先将其define选项关闭,再执行插入,如下所示:
SQL>set define off
SQL>insert into test_char(f_char) values('&id=1');
1 row inserted
SQL>roollback;
Rollback complete
也可以利用chr()函数获得愿义字符“&”.
SQL>insert into test_char(f_char) values(chr(38)) || 'id=1' );
1 row inserted
SQL>select f_char from test_char;
F_CHAR
--------
&id=1
38为字符“&”的ASCII码;chr(38)||‘id=1’用于获得字符串“&id=1”.
2.11 格式化数值---to_char()函数
to_char()函数可以将数值进行格式化,并返回格式化后的字符串,其调用格式如下:
to_char(元数值,格式)
to_char()函数中的格式参数比较复杂,下面将讲述其中最常用的几种。
例子:to_char()函数格式参数由一系列的字符组成,常用的字符包括:0、9、,、FM、$、L。
(1)逗号(,):分组符号。常见的千位分隔符;
(2)FM:Format Mask屏蔽所有不必要的空格和0;
(3)$:美元符号
(4)C:与系统环境相关的国际货币符号。
A. 格式化字符“0”
0,代表一个数字位。当原数值没有数字位与之匹配时,强制添加0.
SQL>select to_char(12.78, '000.000') result from dual;
------------------
012.780
格式化000.000代表将数字格式化为小数点前后各3位。
如果元数值没有数字位与之对应,则使用0进行填充,其结果为0.12780.
B. 格式字符“9”
9,代表一个数字位。当元数值中的整数部分没有数字位与之匹配时,不填充任何字符。
SQL>select to_char(12.78, '999.999') result from dual;
---------------------
12.780
当使用9代替0之后,整数部分中没有数字与格式符对应时,将忽略该位,那么将返回12.780。但是,对于小于1的小数来说,所有格式符均使用9,返回值往往并非期望值。
SQL>select to_char(0.78,'999.999') result from dual;
--------------
.780
很明显,“.78”并非好的表现形式,因此,格式参数中的各位使用“0”是更好的选择。
SQL>select to_char(0.78,'990.999') result from dual;
-------------------
0.780
C. 格式字符“,”
逗号(,)【一定要是英文半角逗号】,分组符号。常见的应用为千位分隔符。
SQL>select to_char(4560000, '99,999,990.00') result from dual;
-------------------
4560,000.00
格式参数99,999,990.00表示整数部分需要利用逗号作为千位分隔符,以格式元数值。
D. 格式字符“FM”------Format Mask
当使用to_char()函数进行数值格式化时,返回值在最前面都不可避免的添加了空格符。
SQL>select to_char(12.78,'999.999') result, to_char(12.78,'FM999.999') fm_result from dual;
RESULT FM_RESULT
------------ ------------------
12.780 12.78
对比使用了FM与没有使用FM的返回值可知,FM格式符的意义在于屏蔽所有不必要的空格和0.
E. 格式字符“$”
to_char()函数的一个典型应用场景为货币数量格式化。为了标识货币,通常在数值之前添加“$”。在to_char()函数中,同样可以利用格式字符"$"在返回值的开头添加美元符号。
SQL>select to_char(12.78,'$999.999') result from dual;
-----------
$12.780
SQL>select to_char(12.78,'999.9$99') result from dual;
----------
$12.780
从以上结果可以看出来,$不一定非得出现在前头,但是FM必须得在前头。
"$FM999.999"中,“$”出现在开头位置,而"FM"紧随其后;ORA-01481:invalid number format model意为不可用的数字格式。
如果,两者对调位置,可执行。
SQL>select to_char(12.78, 'FM$999.999') result from dual;
-----------
$12.78
F. 格式字符“L”
美元符号表示货币,但是货币标识往往具有本地化的色彩。例如:在我国,通常使用“¥”而非$。在to_char()函数中,使用“L”指定本地化的货币标识。
SQL>select to_char(12.78,'FML999.999') result from dual;
-------------
¥12.78
分析to_char()函数的返回值可知,格式字符“L”在开头添加了货币标识“¥”。
G. 格式字符“C”
通常,货币标识只能表示是否为货币,而货币种类无法进行区分。在to_char()函数中,还提供了另外一个格式字符“C”,该字符见返回与数据库环境相关的货币种类符号。
SQL>select to_char(12.78,‘FM999.999C’) result from dual;
----------------------
12.78CNY
H. 十进制数字转换为十六进制
将十进制数字转换为十六进制,实际是以字符串形式来展现。可以利用to_char()函数来实现,此时使用到的格式字符为“X”
SQL>select to_char(255,'xxx') from dual;
----------
ff
这里需要注意的是,格式化字符串“xxx”中"x"的位数不能小于实际十六进制数的位数。否则,将无法获得正确的结果,例如:
SQL>select to_char(255, 'x') from dual;
-----
##