標量資料類型
數值類型
| 類型 | 範圍/精度 | 子類型 | 說明 |
NUMBER(p,s) | p=1..38, s=-84..127 | DEC, DECIMAL, NUMERIC, FLOAT, DOUBLE PRECISION, INTEGER, INT, SMALLINT, REAL | 通用數字,可指定精度/小數位 |
BINARY_INTEGER | -2,147,483,647 .. +2,147,483,647 | NATURAL, NATURALN, POSITIVE, POSITIVEN, SIGNTYPE | 有號整數,儲存較 NUMBER 少 |
PLS_INTEGER | -2,147,483,647 .. +2,147,483,647 | — | 機器運算,**效能最佳**,推薦迴圈計數器 |
SIMPLE_INTEGER | -2,147,483,648 .. +2,147,483,647 | — | 11g+,非 NULL、溢位回繞,效能更高 |
BINARY_FLOAT | IEEE 754 單精度 | — | 10g+,近似數值運算 |
BINARY_DOUBLE | IEEE 754 雙精度 | — | 10g+,近似數值運算 |
字元類型
| 類型 | 最大長度 | 說明 |
CHAR(n) | 32,767 bytes | 固定長度,不足右補空白 |
VARCHAR2(n) | 32,767 bytes | 可變長度,**推薦首選** |
NCHAR(n) | 32,767 bytes | 固定長度 Unicode (國家字元集) |
NVARCHAR2(n) | 32,767 bytes | 可變長度 Unicode |
LONG | 2 GB | **已棄用**,改用 CLOB |
RAW(n) | 32,767 bytes | 二進位資料,不做字元集轉換 |
LONG RAW | 2 GB | **已棄用**,改用 BLOB |
ROWID | 18/10 bytes | 列實體地址,UROWID 支援邏輯 ROWID |
日期時間類型
| 類型 | 精度/範圍 | 說明 |
DATE | 秒 | 含年月日時分秒,範圍 4712 BC ~ 9999 AD |
TIMESTAMP(p) | p=0..9 (奈秒) | 無時區,p=6 為預設 |
TIMESTAMP(p) WITH TIME ZONE | p=0..9 + 時區 | 含時區位移 |
TIMESTAMP(p) WITH LOCAL TIME ZONE | p=0..9 + 自動轉換 | 儲存時正規化為資料庫時區,讀取轉為 Session 時區 |
INTERVAL YEAR(p) TO MONTH | 年月間隔 | 年精度 p=0..9 |
INTERVAL DAY(p) TO SECOND(s) | 日時分秒間隔 | 秒精度 s=0..9 |
布林類型
| 類型 | 值 | 說明 |
BOOLEAN | TRUE, FALSE, NULL | 僅 PL/SQL 可用,**SQL 不支援** |
LOB 大物件類型
| 類型 | 資料類型 | 最大尺寸 | 說明 |
BLOB | 二進位 | 4 GB - 1 (依 block size) | 圖片、文件、加密資料 |
CLOB | 字元 | 4 GB - 1 | 大文本、XML、JSON |
NCLOB | Unicode 字元 | 4 GB - 1 | 多語言大文本 |
BFILE | 外部二進位檔案 | OS 檔案系統限制 | 唯讀、資料庫外部、需 DIRECTORY 物件 |
特性:隨機存取、支援 DBMS_LOB 套件、可作為表欄位、不可跨資料庫連結直接操作。
運算子優先序 (高到低)
| 優先序 | 運算子 | 類型 | 結合性 |
| 1 | ** | 指數 | 右至左 |
| 2 | + - (一元正負號) | 一元 | 右至左 |
| 3 | * / | 算術 | 左至右 |
| 4 | + - || | 算術/串連 | 左至右 |
| 5 | = != <> ~= ^= < > <= >= | 關係 | 左至右 |
| 6 | IS NULL, LIKE, BETWEEN, IN | 比較 | 左至右 |
| 7 | NOT | 邏輯 | 右至左 |
| 8 | AND | 邏輯 | 左至右 |
| 9 | OR | 邏輯 | 左至右 |
運算子分類詳解
算術運算子
+ 加法 - 減法
* 乘法 / 除法
** 指數 (冪)
關係運算子 (回傳 BOOLEAN)
= 等於
!= 不等於 (同 <>、~=、^=)
< 小於
> 大於
<= 小於等於
>= 大於等於
:= 指派 (非比較,用於 PL/SQL 宣告區)
比較運算子 (用於 WHERE/IF)
IS NULL -- 空值檢查
LIKE -- 模糊比對 (% _ 萬用字元)
BETWEEN a AND b -- 範圍檢查 (含邊界)
IN (list) -- 清單檢查
NOT IN / NOT BETWEEN / NOT LIKE / IS NOT NULL -- 否定形式
邏輯運算子
AND 邏輯且 (皆真才真)
OR 邏輯或 (一真即真)
NOT 邏輯非 (取反)
型別轉換與注意事項
隱含轉換
Oracle 自動在下列情況轉換:
- 字串 ↔ 數字:
'123' + 10 = 133
- 字串 ↔ 日期:
'2023-01-01' + 1 (依 NLS_DATE_FORMAT)
- 效能影響:索引欄位發生隱含轉換導致全表掃描
顯式轉換 (推薦)
TO_NUMBER('123.45', '999.99')
TO_CHAR(123.45, 'FM999.00')
TO_DATE('2023-01-01', 'YYYY-MM-DD')
TO_TIMESTAMP('2023-01-01 12:00:00.123', 'YYYY-MM-DD HH24:MI:SS.FF')
CAST(expr AS TYPE) -- ANSI 標準
常見陷阱
| 陷阱 | 說明 | 正確做法 |
| VARCHAR2 比較數字 | '2' > '10' 為 TRUE (字元比較) | 轉數字比較:TO_NUMBER(col) > 10 |
| DATE 比較字串 | 依 NLS_DATE_FORMAT,環境不同結果不同 | date_col = DATE '2023-01-01' |
| NUMBER 精度遺失 | NUMBER(3,2) 存 1.234 → 1.23 | 精度足夠或用 BINARY_DOUBLE |
| CHAR 尾端空白 | CHAR(10) 存 'abc' → 'abc ' | 用 VARCHAR2 或 RTRIM 比較 |
| BOOLEAN 用於 SQL | SELECT * FROM t WHERE flag 報錯 | 改用 flag = 'Y' 或 CASE WHEN flag THEN 1 ELSE 0 END |
宣告最佳實踐
-- 錨定型別 (推薦)
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_row emp%ROWTYPE;
-- 集合型別
TYPE num_arr IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
v_nums num_arr;
-- 記錄型別
TYPE emp_rec IS RECORD (
empno emp.empno%TYPE,
ename emp.ename%TYPE
);
v_emp emp_rec;
-- 常數
c_max_retry CONSTANT PLS_INTEGER := 3;