本記事では、ORACLEのシーケンス(順序)の使用方法について、まとめました。
ちなみに、シーケンスとはどのようなものか、作成や削除の方法については、こちらの記事を参照ください。
シーケンス(順序)の使い方
シーケンス(順序)を使うには、【シーケンス名.NEXTVAL】で値の生成を行います。また、生成と同時にシーケンスはカウントアップされます。
SELECT test_seq1.NEXTVAL a FROM DUAL;
A
-----
1
SELECT test_seq1.NEXTVAL a FROM DUAL;
A
-----
2
SELECT test_seq1.NEXTVAL a FROM DUAL;
A
-----
3
具体的には、INSERT文等の中で直接生成して使用する方法と、プログラムの中で生成して使用する方法の2つが考えられます。
INSERT文等の中で直接生成して使用
以下、1レコードをINSERT文で登録する例です。
INSERT INTO test_table1
(a, b)
VALUES(test_seq1.NEXTVAL, 'a');
-- 登録データ
A B
----- -
1 a
他のテーブルからの抽出結果を元にデータ登録するINSERT-SELECTでも問題なく使用できます。
-- 抽出元テーブルには3件データが格納されている
INSERT INTO test_table1
(a, b)
SELECT test_seq1.NEXTVAL
,b
FROM test_table2
;
-- 登録データ
A B
----- -
1 a
2 b
3 c
プログラムの中で生成して使用
以下、PL/SQLでデータを生成して設定する例です。生成時には、DUAL表を利用します。
※例はエラー処理してません
DECLARE
-- カーソル定義
CURSOL test_cur IS
SELECT b
FROM test_table2
;
-- 変数定義
num NUMBER;
test_rec test_cur%ROWTYPE;
BEGIN
OPEN test_cur;
<test_loop>
LOOP
FETCH test_cur INTO test_rec;
EXIT test_loop WHEN test_cur%NOTFOUND;
-- シーケンス生成
SELECT test_seq1.NEXTVAL INTO num FROM DUAL;
-- データ登録
INSERT INTO test_table1 (a, b) VALUES(num, test_rec.b);
END LOOP test_loop;
CLOSE test_cur;
COMMIT;
END;
/
生成がエラーになるケース
循環なしの設定(NOCYCLE)で、昇順の場合に最大値まで生成済みの場合(降順の場合は最小値)に、次の生成を行うとエラー(ORA-08004)になります。
SELECT test_seq1.NEXTVAL a FROM DUAL; ORA-08004: 順序XXXXX.NEXTVALのexceedsMAXVALUEと矛盾しています。インスタンス化できません ※XXXXXには、シーケンス名が入ります
まとめ
ORACLEのシーケンス(順序)の使い方を見てきました。
DUALテーブルの検索で、SELECT句に【シーケンス名.NEXTVAL】を指定して生成する方法をよく見かけます。
また、INSERT文などに【シーケンス名.NEXTVAL】を記述することも可能です。
関連



