在 Oracle 資料庫中,函數是一種接受零個或多個參數並返回單一值的程式單元。內建函數可直接在 SQL 或 PL/SQL 陳述式中呼叫,主要分為兩大類:單行函數與群組函數(又稱集合函數)。單行函數逐行操作資料,群組函數則對多行資料彙總計算。
單行函數涵蓋字元、數字、日期、轉換等多種類型,可用於 SELECT、WHERE、ORDER BY 等子句。例如:
SELECT ename,
TO_CHAR(hiredate, 'Day, DD-Mon-YYYY')
FROM emp
WHERE UPPER(ename) LIKE 'AL%'
ORDER BY SOUNDEX(ename);
此外,單行函數亦可用於 UPDATE 的 SET 子句、INSERT 的 VALUES 子句及 DELETE 的 WHERE 子句中。
NULL 代表未知或空值,任何算術運算遇到 NULL 結果皆為 NULL,大多數函數亦同。例外函數包括 CONCAT、DECODE、DUMP、NVL、REPLACE,它們在參數為 NULL 時仍可返回非 NULL 值。其中 NVL(expr1, expr2) 最為關鍵:若 expr1 為 NULL 則返回 expr2,否則返回 expr1。
實例:計算員工總薪資(薪資 + 獎金),若獎金為 NULL 需用 NVL 排除影響:
UPDATE emp
SET salary = (salary + NVL(bonus, 0)) * 1.1;
| 函數 | 說明 | 範例 |
|---|---|---|
| ASCII(c) | 回傳字元的 ASCII 碼 | ASCII('A') → 65 |
| CHR(n) | 回傳數字對應的字元 | CHR(65) → 'A' |
| CONCAT(c1, c2) | 串接兩字串,等同 || | CONCAT('A','B') → 'AB' |
| INITCAP(c) | 每個單字首字母大寫 | INITCAP('hello world') → 'Hello World' |
| INSTR(c1, c2, i, j) | 搜尋 c2 在 c1 第 i 位置起第 j 次出現的位置 | INSTR('Mississippi','i',3,3) → 11 |
| LENGTH(c) | 回傳字串長度 | LENGTH('Oracle') → 6 |
| LOWER/UPPER(c) | 大小寫轉換 | UPPER('oracle') → 'ORACLE' |
| LPAD/RPAD(c, n, pad) | 左/右填充字串至指定長度 | LPAD('7', 3, '0') → '007' |
| LTRIM/RTRIM/TRIM(c, set) | 移除首/尾/兩側指定字元 | TRIM(' abc ') → 'abc' |
| REPLACE(c1, c2, c3) | 以 c3 取代 c1 中的 c2 | REPLACE('uptown','up','down') → 'downtown' |
| SUBSTR(c, i, j) | 擷取子字串 | SUBSTR('Message',1,4) → 'Mess' |
| SOUNDEX(c) | 回傳發音相似代碼 | SOUNDEX('dawes') → 'D200' |
| TRANSLATE(c1, c2, c3) | 逐字元對應取代 | TRANSLATE('fumble','uf','ar') → 'ramble' |
操作數值資料,執行數學運算。所有三角函數參數與結果均為弧度。常用函數包括:
ABS(n):絕對值CEIL/FLOOR(n):大於等於/小於等於 n 的最小/最大整數ROUND/TRUNC(n, m):四捨五入/截斷至 m 位小數(m 可為負數)POWER(n1, n2):n1 的 n2 次方MOD(n1, n2):餘數SQRT(n):平方根SIN、COS、TAN 及其反函數、雙曲函數LN/LOG/EXP:對數與指數運算操作 DATE 型別資料,多數回傳 DATE 值:
ADD_MONTHS(d, n):日期加減月份LAST_DAY(d):該月最後一天MONTHS_BETWEEN(d1, d2):兩日期相差月數NEXT_DAY(d, '星期'):日期之後指定星期的第一天ROUND/TRUNC(d, fmt):日期四捨五入/截斷SYSDATE:目前系統日期時間NEW_TIME:時區轉換實現資料型別間轉換:
TO_CHAR(x, fmt, nls):數字/日期轉字串TO_DATE(c, fmt, nls):字串轉日期TO_NUMBER(c, fmt, nls):字串轉數字HEXTORAW/RAWTOHEX:十六進位與 RAW 互轉CHARTOROWID/ROWIDTOCHAR:ROWID 與 CHAR 互轉CONVERT:字元集轉換TO_MULTI_BYTE/TO_SINGLE_BYTE:單/多位元組字元互轉DECODE(expr, search, result [, ...] [, default]):條件判斷,類似 IF-THEN-ELSEGREATEST/LEAST(expr_list):回傳最大/最小值DUMP(expr, fmt, start, length):回傳內部表示資訊VSIZE(expr):回傳內部表示位元組數USER/UID/USERENV:會話資訊函數EMPTY_BLOB/CLOB/BFILENAME:LOB 初始化函數群組函數對多行資料彙總返回單一結果,常與 GROUP BY 搭配使用,可用於 SELECT 或 HAVING 子句,不可用於 WHERE 子句。
| 函數 | 說明 |
|---|---|
| AVG([DISTINCT|ALL] expr) | 平均值 |
| COUNT({*|DISTINCT|ALL} expr) | 行數統計 |
| MAX/MIN([DISTINCT|ALL] expr) | 最大/最小值 |
| SUM([DISTINCT|ALL] expr) | 總和 |
| STDDEV/VARIANCE([DISTINCT|ALL] expr) | 標準差/變異數 |