Oracleのシーケンスを使って連番を作成する

Oracleのシーケンスとは、1, 2, 3,…のような連番を作成できるデータベース・オブジェクトです。レコードをINSERTするときにユニークなIDを生成するのに便利です。この記事ではシーケンスの使い方をご紹介します。

シーケンス(順序)とは、一意な整数を生成することができる順序番号ジェネレータ(生成器)です。順序はスキーマ・オブジェクトです。

SQL文

順序(シーケンス)を操作するSQL文の一覧を次に示す。

CREATE SEQUENCE
順序を作成する。
ALTER SEQUENCE
順序を変更する。
DROP SEQUENCE
順序を削除する。

シーケンスを取得する (NEXTVAL)

順序から新たな順序値を生成するには、NEXTVAL擬似列を参照します。NEXTVAL擬似列を参照する構文は次のとおりです。

sequence.NEXTVAL

SELECT文で新たに順序値を生成するには、FROM句にDUAL表を指定します。SELECT文で新たに順序値を生成する例を次に示します。

SQL> SELECT customerid_seq.NEXTVAL FROM DUAL;

 NEXTVAL
----------
       1

SQL> SELECT customerid_seq.NEXTVAL FROM DUAL;

 NEXTVAL
----------
       2

SQL>

INSERT文で順序を使用する例を次に示します。

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (empno.NEXTVAL, '堀内まり菜', 'CHAIRMAN', NULL, '10-04-01', 5000, NULL, 10)

UPDATE文で順序を使用する例を次に示します。

UPDATE customer SET customer_id = customerid_seq.NEXTVAL WHERE customer_name = '矢島舞美'

なお、トランザクションをロールバックしても、シーケンス番号は元に戻らない。

シーケンスを確認する (CURRVAL)

NEXTVALでシーケンスを取得した後、CURRVAL擬似列でシーケンスの現在値を確認できる。

sequence.CURRVAL

SELECT文で最後に生成した順序値を参照するには、FROM句にDUAL表を指定します。SELECT文で最後に生成した値を参照する例を次に示します。

SQL> SELECT customerid_seq.CURRVAL FROM DUAL;

 CURRVAL
----------
       2

SQL>

NEXTVALでシーケンスを取得していない状態でCURRVALを参照すると、「ORA-08002: 順序sequence.CURRVALはこのセッションではまだ定義されていません」のエラーが発生する。

システム権限

順序を操作するために必要なシステム権限の一覧を次に示す。

CREATE SEQUENCE
自分のスキーマ内にシーケンスを作成する。自分が所有するシーケンスを変更する。自分が所有するシーケンスを削除する。自分が所有するシーケンスから現在値または次の値を参照する。
ALTER ANY SEQUENCE
他ユーザのスキーマ内にあるシーケンスを変更する。
DROP ANY SEQUENCE
他ユーザのスキーマ内にあるシーケンスを削除する。
SELECT ANY SEQUENCE
他ユーザのスキーマ内にあるシーケンスから現在値または次の値を参照する。

オブジェクト権限

順序を操作するために必要なオブジェクト権限の一覧を次に示す。

SELECT
この順序から現在値または次の値を参照する。

データ・ディクショナリ

順序に関するデータ・ディクショナリ・ビューの一覧を次に示す。

ALL_SEQUENCES
現在のユーザーがアクセスできる順序
DBA_SEQUENCES
データベース内すべての順序
USER_SEQUENCES
現在のユーザーが所有する順序

ALL_SEQUENCES

データ型 NULL
SEQUENCE_OWNER VARCHAR2(30) NOT NULL
SEQUENCE_NAME VARCHAR2(30) NOT NULL
MIN_VALUE NUMBER
MAX_VALUE NUMBER
INCREMENT_BY NUMBER NOT NULL
CYCLE_FLAG VARCHAR2(1)
ORDER_FLAG VARCHAR2(1)
CACHE_SIZE NUMBER NOT NULL
LAST_NUMBER NUMBER NOT NULL