2017/12/07
本記事では、ORACLEのシーケンス(順序)の使用方法について、まとめました。
ちなみに、シーケンスとはどのようなものか、作成や削除の方法については、こちらの記事を参照ください。
sponsored link
シーケンス(順序)の使い方
シーケンス(順序)を使うには、【シーケンス名.NEXTVAL】で値の生成を行います。また、生成と同時にシーケンスはカウントアップされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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文で登録する例です。
1 2 3 4 5 6 7 8 |
INSERT INTO test_table1 (a, b) VALUES(test_seq1.NEXTVAL, 'a'); -- 登録データ A B ----- - 1 a |
他のテーブルからの抽出結果を元にデータ登録するINSERT-SELECTでも問題なく使用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-- 抽出元テーブルには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表を利用します。
※例はエラー処理してません
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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)になります。
1 2 3 |
SELECT test_seq1.NEXTVAL a FROM DUAL; ORA-08004: 順序XXXXX.NEXTVALのexceedsMAXVALUEと矛盾しています。インスタンス化できません ※XXXXXには、シーケンス名が入ります |
まとめ
ORACLEのシーケンス(順序)の使い方を見てきました。
DUALテーブルの検索で、SELECT句に【シーケンス名.NEXTVAL】を指定して生成する方法をよく見かけます。
また、INSERT文などに【シーケンス名.NEXTVAL】を記述することも可能です。
関連