Sequence 核心行為
Sequence 產生唯一序列號,常用於主鍵生成。關鍵特性:
- 首次 NEXTVAL 回傳初始值(START WITH)
- 後續 NEXTVAL 自動增加 INCREMENT BY 值並回傳新值
- CURRVAL 回傳當前值,必須在首次 NEXTVAL 後才可使用,否則報錯
- 同一陳述式中多次呼叫 NEXTVAL,每次都會遞增,回傳值不同
CACHE 與 NOCACHE:效能與間隙權衡
| 模式 | 運作方式 | 優點 | 缺點 |
| CACHE n | 預先在記憶體配置 n 個序列值 | 存取快,減少磁碟 I/O | 異常關機(SHUTDOWN ABORT)導致快取值遺失,產生間隙 |
| NOCACHE | 每次從磁碟讀取/更新 | 不會間隙,數值連續 | 效能較低,高併發下可能成為瓶頸 |
初始化參數 SEQUENCE_CACHE_ENTRIES 控制可同時快取的 Sequence 數量。
ALTER SEQUENCE 修改規則
- 擁有者或具備
ALTER ANY SEQUENCE 權限才能修改
- 可修改除
START WITH 外的所有參數
- 需變更起始值時,必須
DROP SEQUENCE 重建
ALTER 範例
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 達到最大值後循環
NOCACHE; -- 關閉快取防止間隙
觸發器實作自動遞增主鍵(11g 前通用做法)
建立 Sequence
CREATE SEQUENCE seq_id
MINVALUE 1
MAXVALUE 99999999
START WITH 1
INCREMENT BY 1
NOCACHE
ORDER;
建立 BEFORE INSERT 觸發器
CREATE OR REPLACE TRIGGER tri_test_id
BEFORE INSERT ON s_depart
FOR EACH ROW
DECLARE
v_next_id NUMBER;
BEGIN
IF :NEW.depart_id IS NULL OR :NEW.depart_id = 0 THEN
SELECT seq_id.NEXTVAL INTO v_next_id FROM DUAL;
:NEW.depart_id := v_next_id;
END IF;
END tri_test_id;
/
關鍵點:
- 僅在主鍵為 NULL 或 0 時自動填充,保留手動指定彈性
- 使用
SELECT ... INTO 而非直接賦值,相容舊版本
- 12c+ 可直接使用
GENERATED AS IDENTITY 簡化
常見問題排查
- ORA-08002:尚未呼叫 NEXTVAL 即使用 CURRVAL
- 間隙過大:檢查 CACHE 設定、是否頻繁異常關機、ROLLBACK 導致序列值消耗
- 效能瓶頸:高併發下考慮增大 CACHE、使用 ORDER/NOORDER、或改用 Identity Column
- 上一篇文章: Oracle 觸發器全面指南:類型、語法、時機與實戰範例
- 下一篇文章: Oracle Java Stored Procedure 實戰:檔案操作、Shell 執行與網路 Socket 整合
Copyright ©
程式碼之家 All Rights Reserved