Oracle Sequence とは

順序を使用することで、一意な番号を取得することができる。シーケンスとも呼ぶ。
連番をプログラム内で使いたい時などに役立つ。

順序の採番はトランザクションの影響を受けない。複数のテーブル、ユーザで
同一の順序を共用することもできるが、同時に取得しても別々に採番される。
よってタイミング次第では番号が飛び石のように見えることもある。

インスタンスの起動/停止にも依存せす、リセットしたい場合は削除して再作成する。
これもデータベースオブジェクトのひとつだが、直接アクセスするものではなく
select 文の中で、擬似列を使う。

現在の値は CURRVAL 疑似列 、次の値は NEXTVAL 疑似列 を使用して取得する。



シーケンス作成SQL

create sequence シーケンス名

  [ increment by 増分値 ]
      → デフォルトは1。マイナス値で降順採番。

  [ start with 初期値 ]
      → デフォルトは1。正数最大28桁、負数は27桁まで。

  [ maxvalue 最大値 | nomaxvalue ]
      → デフォルトは1。正数最大28桁、負数は27桁まで。
         初期値( start with )以上 & 最小値( minvalue )より
         大きい必要がある。

  [ minvalue 最小値 | nominvalue ]
      → デフォルトは1。正数最大28桁、負数は27桁まで。
         初期値( start with )以下 & 最大値( maxvalue )より
         小さい必要がある。

  [ cycle | nocycle ]
      → 最大値( maxvalue )に達した時に、番号を最小値から
         循環利用するか。デフォルトは nocycle。

  [ cache メモリ値 | nocache ]
      → メモリ上に予め割り当てて保持しておくか。
         デフォルトは20。

  [ order | noorder ]
      → 要求した順に採番することを保証するか。
         デフォルトは noorder。
;

順序(シーケンス)の作成

SQL>
create sequence testseq
  increment by 1
  start with 1
  maxvalue 5
  minvalue 1
  cycle
  cache 3
  order;

順序が作成されました。

現在のシーケンスを取得

SQL> select 順序名.currval from dual;
SQL> select testseq.currval from dual;

   CURRVAL
----------
         1

currval 擬似列は、今のユーザが一番最後に採番した番号を返すので、
一度も取得していない場合はエラーとなる。

SQL> select testseq.currval from dual;
select testseq.currval from dual
       *
行1でエラーが発生しました。:
ORA-08002: 順序TESTSEQ.CURRVALはこのセッションではまだ定義されていません

次の値を取得

SQL> select 順序名.nextval from dual;
SQL> select testseq.nextval from dual;

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

SQL> /

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

SQL> /

   NEXTVAL
----------
         3

SQL> /

   NEXTVAL
----------
         4

SQL> /

   NEXTVAL
----------
         5

SQL> /

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

上記の順序サンプルでは、cycle が指定のため、maxvalue の値 5 に達すると 1 に戻る。
nocycle の場合は、以下のエラーとなる。

select testseq.nextval from dual
*
行1でエラーが発生しました。:
ORA-08004:
順序TESTSEQ.NEXTVALのexceedsMAXVALUEと矛盾しています。インスタンス化できません

順序の削除

SQL> drop sequence 順序名;