Oracle 無 Identity 欄位(12c 前),實現自增三大法:Sequence + Trigger(最常用)、Sequence 直接在 SQL 呼叫、儲存程序封裝。本文聚焦 Sequence 進階語法與儲存程式整合。
CREATE SEQUENCE salary_seq
MINVALUE 100
MAXVALUE 9999999999
START WITH 560
INCREMENT BY 1
CACHE 20; -- 預存 20 個值於 SGA,高併發效能最佳
INSERT INTO emp (empno, ename, job) VALUES (salary_seq.NEXTVAL, 'LEWIS', 'CLERK');
SELECT salary_seq.CURRVAL FROM dual; -- 需同 Session 先呼叫過 NEXTVAL
CREATE OR REPLACE PROCEDURE get_next_empno (p_empno OUT NUMBER) AS
BEGIN
SELECT salary_seq.NEXTVAL INTO p_empno FROM dual;
END;
/
-- 呼叫範例
VARIABLE v_empno NUMBER;
EXEC get_next_empno(:v_empno);
PRINT v_empno;
ALTER SEQUENCE salary_seq
INCREMENT BY 10
MAXVALUE 10000
CYCLE
NOCACHE;
DROP SEQUENCE salary_seq;
START WITH 無法 ALTER,需 DROP 重建。CACHE 與 NOCACHE 切換即時生效。SEQUENCE_CACHE_ENTRIES:控制可同時緩存的 Sequence 數量(預設 10/20 視版本)。
CACHE 100~1000 + NOORDER(RAC 環境)。CACHE 20 即可。SELECT ... NEXTVAL 導致雙重遞增。Sequence 是 Oracle 自增核心,善用 CACHE/ORDER/NOORDER 控制效能與順序保證,儲存程序封裝可統一取號邏輯並便於審計。