Oracleのシーケンスとは、1, 2, 3,…のような連番を作成できるデータベース・オブジェクトです。レコードをINSERTするときにユニークなIDを生成するのに便利です。この記事ではシーケンスの使い方をご紹介します。
シーケンス(順序)とは、一意な整数を生成することができる順序番号ジェネレータ(生成器)です。順序はスキーマ・オブジェクトです。
順序(シーケンス)を操作するSQL文の一覧を以下に示す。
CREATE SEQUENCE は、順序を作成するSQL文である。
ALTER SEQUENCE は、順序を変更するSQL文である。
DROP SEQUENCE は、順序を削除するSQL文である。
順序から新たな順序値を生成するには、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 INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (empno.NEXTVAL, '堀内まり菜', 'CHAIRMAN', NULL, '10-04-01', 5000, NULL, 10)
行を更新するときに順序を使用する例を次に示す。
UPDATE customer SET customer_id = customerid_seq.NEXTVAL WHERE customer_name = '矢島舞美'
なお、トランザクションをロールバックしても、シーケンス番号は元に戻らない。
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 は、この順序から現在値または次の値を参照するオブジェクト権限である。
SQL> GRANT ON empno TO TSUKAMOTO;
順序に関するデータ・ディクショナリ・ビューの一覧を以下に示す。
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 |
順序の所有者
順序名
順序の最小値
順序の最大値
順序が増やされるときの増分値
限度に達したときに、順序の繰返しを実行するかどうか
値 | 説明 |
---|---|
Y | 順序の繰返しを実行する |
N | 順序の繰返しを実行しない |
順序番号が順番に生成されるかどうか
値 | 説明 |
---|---|
Y | 順序番号が順番に生成される |
N | 順序番号が順番に生成されない |
キャッシュする順序番号の数
最後にディスクに書き込まれる順序番号。順序にキャッシュが使用される場合、ディスクに書き込まれる番号は、最後に順序キャッシュに入れられた番号。この番号は、前回に使用された順序番号より大きくなる。
DBA_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 |
USER_SEQUENCES は、現在のユーザーが所有する順序を示すデータ・ディクショナリ・ビューである。
列 | データ型 | 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 |