シーケンス(順序)の使用方法

ORACLE
20170215-1

本記事では、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】を記述することも可能です。

関連


タイトルとURLをコピーしました