【数据库】Oracle中的数值型及处理方法

时间:2024-02-15 18:55:50

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;

-----

##