順序

  使用目的



Oracle 的には、順序は「複数のユーザーが一意の整数を生成することができるデータベースオブジェクトの1 つ」、となりますが、システム的には、「採番」の方法論です

一意の整数を生成する事は、Oracle 的には 「主キーを作成する」という発想になりますが、テーブル設計時にそのような方法で主キーを適用するような事はあまりありません。テーブルの「主キー」はコードであるか、意味を持った複合キーになります。どちらの場合でも、キーの値そのものに意味を持たせる事がシステム的に有用です。

テーブルの種別で考えれば、マスタとトランザクションという考え方があります。前者に自動でキーを与える事は通常考えられません。しかし、トランザクションであれば必要な場合があります。トランザクションは、システムでは日々発生するデータであり、逆に意味のある一意のキーという考え方と相反するものです。それでも、設計によって一意キーが確実に設定できる場合がありますが、そうで無い場合もあります。そのような場合自動でキーを生成する事は便利な場合が少なくありません。

その代表的な例が、「伝票番号」です。これは、業務処理上絶対に必要なものですが、番号自体の意味は過去が小さい番号であるというくらいしか意味を持ちません。中には、番号の一部に「発行年」というような意味を持たす場合がありますが、基本的には連番が必要になります。

そのような連番を取得する事を「採番」と言います。Oracle の場合、そのような場合に「利用」できるのが順序です。しかし、必ずしも順序を使用するというとそうでもありません。「採番」は、テーブルにそれ用のフィールドを持たせてテーブルで管理するほうが、システムとして見渡しが良い場合もありますし、メンテナンスの小回りがききます。なにより、順序に対する知識が必要ありません。ただ、その為にプログラミングでは多少の負荷を覚悟する必要があります。




  順序の作成



一番簡単な順序の作成は以下のようになります

  
create sequence 順序名
  

その場合の内容です。select * from USER_SEQUENCES で参照します

MIN_VALUE MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG CACHE_SIZE LAST_NUMBER
1 1 1E+27 1 N N 20 1




  増分と開始位置

  
create sequence 売上伝票
	increment by 10
	start with 25
  

MIN_VALUE MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG CACHE_SIZE LAST_NUMBER
1 1 1E+27 10 N N 20 25

LAST_NUMBER に表示されているのは、次の番号では無く現在キャッシュされている最後の番号です
CACHE_SIZE は、デフォルトで 20 であり、大きさを指定する場合は CACHE n と指定します
キャッシュしない場合は、CACHE NOCACHE です



  最小値と最大値

デフォルトでは、最小値は 1 、最大値は 1E+27 となります。これらは、順序がとれる値の範囲を意味します。意図的にデフォルトにするには、MINVALUE NOMINVALUEMAXVALUE NOMAXVALUE を指定します

  
create sequence 売上伝票
	increment by -10
	start with 25
	maxvalue 25
  

MIN_VALUE MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG CACHE_SIZE LAST_NUMBER
1 -1E+26 25 -10 N N 20 25



  制限値に達した時の動作

増分値が正の数の場合制限値は MAX_VALUE になります。負の数の場合は MIN_VALUE です。デフォルトでは NOCYCLE であり、制限値に達すると次の値を取得できずに取得しようとするとエラーになります。CYCLE では、反対側の制限値になります



  初期値の変更

初期値を変更する為には、順序を削除して作成しなおす必要があります。それ以外は ALTER SEQUENCE で変更できます



  順序の利用

順序の値の取得には、順序名.NEXTVAL を使用します。Oracle 的には NEXTVAL は「擬似列」と呼ばれます。使用できる場所は、アプリケーションで取得する為に、通常の SELECT 句で使用します。

SQL 内で直接使用する為に、INSERT の VALUES 句、UPDATE の SET 句で使用します。

NEXTVAL 以外に、CURRVAL という擬似列がありますが、現セッションで一度 NEXTVAL を参照した場合のみ使用できます。
セッションは、接続の事です。アプリケーション的に接続解除されていても、ODBC の場合、通常接続プールが設定されている
ので、その間に再接続した場合はセッションが継続されている場合があります










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ