【數據庫】Oracle中的數值型及處理方法

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;

-----

##


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章