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;
-----
##