首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PL/SQL 資料類型與運算子完整參考:標量、LOB、運算子優先序

     編輯:Oracle 資料庫相關知識

標量資料類型

數值類型

類型範圍/精度子類型說明
NUMBER(p,s)p=1..38, s=-84..127DEC, DECIMAL, NUMERIC, FLOAT, DOUBLE PRECISION, INTEGER, INT, SMALLINT, REAL通用數字,可指定精度/小數位
BINARY_INTEGER-2,147,483,647 .. +2,147,483,647NATURAL, 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_FLOATIEEE 754 單精度—10g+,近似數值運算
BINARY_DOUBLEIEEE 754 雙精度—10g+,近似數值運算

字元類型

類型最大長度說明
CHAR(n)32,767 bytes固定長度,不足右補空白
VARCHAR2(n)32,767 bytes可變長度,**推薦首選**
NCHAR(n)32,767 bytes固定長度 Unicode (國家字元集)
NVARCHAR2(n)32,767 bytes可變長度 Unicode
LONG2 GB**已棄用**,改用 CLOB
RAW(n)32,767 bytes二進位資料,不做字元集轉換
LONG RAW2 GB**已棄用**,改用 BLOB
ROWID18/10 bytes列實體地址,UROWID 支援邏輯 ROWID

日期時間類型

類型精度/範圍說明
DATE秒含年月日時分秒,範圍 4712 BC ~ 9999 AD
TIMESTAMP(p)p=0..9 (奈秒)無時區,p=6 為預設
TIMESTAMP(p) WITH TIME ZONEp=0..9 + 時區含時區位移
TIMESTAMP(p) WITH LOCAL TIME ZONEp=0..9 + 自動轉換儲存時正規化為資料庫時區,讀取轉為 Session 時區
INTERVAL YEAR(p) TO MONTH年月間隔年精度 p=0..9
INTERVAL DAY(p) TO SECOND(s)日時分秒間隔秒精度 s=0..9

布林類型

類型值說明
BOOLEANTRUE, FALSE, NULL僅 PL/SQL 可用,**SQL 不支援**

LOB 大物件類型

類型資料類型最大尺寸說明
BLOB二進位4 GB - 1 (依 block size)圖片、文件、加密資料
CLOB字元4 GB - 1大文本、XML、JSON
NCLOBUnicode 字元4 GB - 1多語言大文本
BFILE外部二進位檔案OS 檔案系統限制唯讀、資料庫外部、需 DIRECTORY 物件

特性:隨機存取、支援 DBMS_LOB 套件、可作為表欄位、不可跨資料庫連結直接操作。

運算子優先序 (高到低)

優先序運算子類型結合性
1**指數右至左
2+ - (一元正負號)一元右至左
3* /算術左至右
4+ - ||算術/串連左至右
5= != <> ~= ^= < > <= >=關係左至右
6IS NULL, LIKE, BETWEEN, IN比較左至右
7NOT邏輯右至左
8AND邏輯左至右
9OR邏輯左至右

運算子分類詳解

算術運算子


+  加法        -  減法
*  乘法        /  除法
** 指數 (冪)

關係運算子 (回傳 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 用於 SQLSELECT * 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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved