PL/SQL單行函數和組函數詳解 函數是一種有零個或多個參數並且有一個返回值的程序
在SQL中Oracle內建了一系列函數
這些函數都可被稱為SQL或PL/SQL語句
函數主要分為兩大類: 單行函數; 組函數
本文將討論如何利用單行函數以及使用規則
SQL中的單行函數
SQL和PL/SQL中自帶很多類型的函數
有字符
數字
日期
轉換
和混合型等多種函數用於處理單行數據
因此這些都可被統稱為單行函數
這些函數均可用於SELECT
WHERE
ORDER BY等子句中
例如下面的例子中就包含了TO_CHAR
UPPER
SOUNDEX等單行函數
SELECT ename
TO_CHAR(hiredate
day
DD
Mon
YYYY
)FROM empWhere UPPER(ename) Like
AL%
ORDER BY SOUNDEX(ename)
單行函數也可以在其他語句中使用
如update的SET子句
INSERT的VALUES子句
DELET的WHERE子句
認證考試特別注意在SELECT語句中使用這些函數
所以我們的注意力也集中在SELECT語句中
NULL和單行函數 在如何理解NULL上開始是很困難的
就算是一個很有經驗的人依然對此感到困惑
NULL值表示一個未知數據或者一個空值
算術操作符的任何一個操作數為NULL值
結果均為提個NULL值
這個規則也適合很多函數
只有CONCAT
DECODE
DUMP
NVL
REPLACE在調用了NULL參數時能夠返回非NULL值
在這些中NVL函數時最重要的
因為他能直接處理NULL值
NVL有兩個參數:NVL(x
x
)
x
和x
都式表達式
當x
為null時返回X
否則返回x
下面我們看看emp數據表它包含了薪水
獎金兩項
需要計算總的補償
column name emp_id salary bonuskey type pk nulls/unique nn
u nnfk table datatype number number numberlength
不是簡單的將薪水和獎金加起來就可以了
如果某一行是null值那麼結果就將是null
比如下面的例子:
update empset salary=(salary+bonus)*
這個語句中
雇員的工資和獎金都將更新為一個新的值
但是如果沒有獎金
即 salary + null
那麼就會得出錯誤的結論
這個時候就要使用nvl函數來排除null值的影響
所以正確的語句是:
update empset salary=(salary+nvl(bonus
)*
單行字符串函數 單行字符串函數用於操作字符串數據
他們大多數有一個或多個參數
其中絕大多數返回字符串
ASCII()
c
是一字符串
返回c
第一個字母的ASCII碼
他的逆函數是CHR()
SELECT ASCII(
A
) BIG_A
ASCII(
z
) BIG_z FROM empBIG_A BIG_z
CHR()[NCHAR_CS]
i是一個數字
函數返回十進制表示的字符
select CHR(
)
CHR(
)
CHR(
) FROM empCHR
CHR
CHR
A z B
CONCAT(
)
c
c
均為字符串
函數將c
連接到c
的後面
如果c
為null
將返回c
如果c
為null
則返回c
如果c
c
都為null
則返回null
他和操作符||返回的結果相同
select concat(
slobo
Svoboda
) username from dualusernameslobo Syoboda
INITCAP()
c
為一字符串
函數將每個單詞的第一個字母大寫其它字母小寫返回
單詞由空格
控制字符
標點符號限制
select INITCAP(
veni
vedi
vici
) Ceasar from dualCeasarVeni
Vedi
Vici
INSTR(
[
[
]])
c
c
均為字符串
i
j為整數
函數返回c
在c
中第j次出現的位置
搜索從c
的第i個字符開始
當沒有發現需要的字符時返回
如果i為負數
那麼搜索將從右到左進行
但是位置的計算還是從左到右
i和j的缺省值為
select INSTR(
Mississippi
i
) from dualINSTR(
MISSISSIPPI
I
)
select INSTR(
Mississippi
i
) from dualINSTR(
MISSISSIPPI
I
)
INSTRB(
[
i[
j])
與INSTR()函數一樣
只是他返回的是字節
對於單字節INSTRB()等於INSTR()
LENGTH()
c
為字符串
返回c
的長度
如果c
為null
那麼將返回null值
select LENGTH(
Ipso Facto
) ergo from dualergo
LENGTHb()
與LENGTH()一樣
返回字節
lower()
返回c的小寫字符
經常出現在where子串中
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE
%white%
COLORNAMEWinterwhite
LPAD(
[
])
c
c
均為字符串
i為整數
在c
的左側用c
字符串補足致長度i
可多次重復
如果i小於c
的長度
那麼只返回i那麼長的c
字符
其他的將被截去
c
的缺省值為單空格
參見RPAD
select LPAD(answer
) padded
answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe
LTRIM(
)
把c
中最左邊的字符去掉
使其第一個字符不在c
中
如果沒有c
那麼c
就不會改變
select LTRIM(
Mississippi
Mis
) from dualLTRppi
RPAD(
[
])
在c
的右側用c
字符串補足致長度i
可多次重復
如果i小於c
的長度
那麼只返回i那麼長的c
字符
其他的將被截去
c
的缺省值為單空格
其他與LPAD相似
RTRIM(
)
把c
中最右邊的字符去掉
使其第後一個字符不在c
中
如果沒有c
那麼c
就不會改變
REPLACE(
[
])
c
c
c
都是字符串
函數用c
代替出現在c
中的c
後返回
select REPLACE(
uptown
up
down
) from dualREPLACEdowntown
STBSTR(
[
])
c
為一字符串
i
j為整數
從c
的第i位開始返回長度為j的子字符串
如果j為空
則直到串的尾部
select SUBSTR(
Message
) from dualSUBSMess
SUBSTRB(
[
])
與SUBSTR大致相同
只是I
J是以字節計算
SOUNDEX()
返回與c
發音相似的詞
select SOUNDEX(
dawes
) Dawes SOUNDEX(
daws
) Daws
SOUNDEX(
dawson
) from dualDawes Daws DawsonD
D
D
TRANSLATE(
)
將c
中與c
相同的字符以c
代替
select TRANSLATE(
fumble
uf
ar
) test from dualTEXTramble
TRIM([[]] from c
)
將c
串中的第一個
最後一個
或者都刪除
select TRIM(
space padded
) trim from dual TRIMspace padded
UPPER()
返回c
的大寫
常出現where子串中
select name from dual where UPPER(name) LIKE
KI%
NAMEKING
單行數字函數 單行數字函數操作數字數據
執行數學和算術運算
所有函數都有數字參數並返回數字值
所有三角函數的操作數和值都是弧度而不是角度
oracle沒有提供內建的弧度和角度的轉換函數
ABS()
返回n的絕對值
ACOS()
反余玄函數
返回
到
之間的數
n表示弧度
select ACOS(
) pi
ACOS(
) ZERO FROM dualPI ZERO
ASIN()
反正玄函數
返回
到
n表示弧度
ATAN()
反正切函數
返回n的反正切值
n表示弧度
CEIL()
返回大於或等於n的最小整數
COS()
返回n的余玄值
n為弧度
COSH()
返回n的雙曲余玄值
n 為數字
select COSH(<
>) FROM dualCOSH(
)
EXP()
返回e的n次冪
e=
FLOOR()
返回小於等於N的最大整數
LN()
返回N的自然對數
N必須大於
LOG(
)
返回以n
為底n
的對數
MOD()
返回n
除以n
的余數
POWER(
)
返回n
的n
次方
ROUND(
)
返回捨入小數點右邊n
位的n
的值
n
的缺省值為
這回將小數點最接近的整數
如果n
為負數就捨入到小數點左邊相應的位上
n
必須是整數
select ROUND(
)
ROUND(
) FROM dualROUND(
) ROUND(
)
SIGN()
如果n為負數
返回
如果n為正數
返回
如果n=
返回
SIN()
返回n的正玄值
n為弧度
SINH()
返回n的雙曲正玄值
n為弧度
SQRT()
返回n的平方根
n為弧度
TAN()
返回n的正切值
n為弧度
TANH()
返回n的雙曲正切值
n為弧度
TRUNC(
)
返回截尾到n
位小數的n
的值
n
缺省設置為
當n
為缺省設置時會將n
截尾為整數
如果n
為負值
就截尾在小數點左邊相應的位上
單行日期函數 單行日期函數操作DATA數據類型
絕大多數都有DATA數據類型的參數
絕大多數返回的也是DATA數據類型的值
ADD_MONTHS(
)
返回日期d加上i個月後的結果
i可以使任意
From:http://tw.wingwit.com/Article/program/Oracle/201311/17021.html