SQL*Plus 執行 PL/SQL 區塊或多行指令,**必須以單獨一行 / 結束**並送出執行。
CREATE SEQUENCE seq_name
[INCREMENT BY n] -- 步長,預設 1;負值為遞減
[START WITH n] -- 起始值,預設 1
[MAXVALUE n | NOMAXVALUE] -- 最大值,預設 NOMAXVALUE (遞增上限 10^27)
[MINVALUE n | NOMINVALUE] -- 最小值,預設 NOMINVALUE (遞減下限 -10^26)
[CYCLE | NOCYCLE] -- 循環/不循環,預設 NOCYCLE
[CACHE n | NOCACHE]; -- 記憶體預取,預設 CACHE 20
NOCACHE 無間隙但效能較差。NOCYCLE 達極值報錯 ORA-08004。START WITH 應大於 MINVALUE。DROP SEQUENCE seq_name;
TEST,主鍵 TEST_ID-- 1. 建立 Sequence
CREATE SEQUENCE seq_test
INCREMENT BY 1
START WITH 1
MINVALUE 1
NOMAXVALUE
NOCYCLE
CACHE 20;
-- 2. 建立 BEFORE INSERT Trigger
CREATE OR REPLACE TRIGGER trg_test
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
SELECT seq_test.NEXTVAL INTO :NEW.test_id FROM dual;
END;
/
INSERT INTO test (test_id, col1) VALUES (seq_test.NEXTVAL, 'value');
優點:簡單、無 Trigger 開銷;缺點:應用程式需知 Sequence 名稱,耦合度較高。
SELECT seq_test.CURRVAL FROM dual; -- 當前 Session 最後取得的值
SELECT seq_test.NEXTVAL FROM dual; -- 取得下一值並前進
CURRVAL 必須在同 Session 先呼叫過 NEXTVAL,否則報 ORA-08002。
-- 方法:取得下一值並計算差值,負增量調整
SELECT seq_test.NEXTVAL FROM dual; -- 假設回傳 1001
ALTER SEQUENCE seq_test INCREMENT BY -1000;
SELECT seq_test.NEXTVAL FROM dual; -- 回傳 1
ALTER SEQUENCE seq_test INCREMENT BY 1;
SELECT sequence_name, last_number, cache_size, increment_by
FROM user_sequences
WHERE sequence_name = 'SEQ_TEST';
LAST_NUMBER:已快取的下一個可用號碼(含快取區間)。LAST_NUMBER。CREATE TABLE test (
test_id NUMBER GENERATED ALWAYS AS IDENTITY,
col1 VARCHAR2(100)
);
GENERATED BY DEFAULT ON NULL 允許手工指定值。Sequence 是 Oracle 產生唯一序號的核心機制。掌握 CACHE/CYCLE/INCREMENT 行為、善用 TRIGGER 或 12c IDENTITY 實現自增主鍵,並理解 LAST_NUMBER 與實際發號的關係,是資料模型設計的基本功。