CREATE SEQUENCE ステートメント

CREATE SEQUENCE ステートメントは、アプリケーション・サーバーでのシーケンスを定義します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • データベースに対する IMPLICIT_SCHEMA 権限 (シーケンスの暗黙または明示のスキーマ名が存在しない場合)
  • スキーマに対する CREATEIN 特権 (シーケンスのスキーマ名が既存のスキーマを指している場合)
  • スキーマに対する SCHEMAADM 権限 (シーケンスのスキーマ名が既存のスキーマを指している場合)
  • DBADM 権限

既存のシーケンスを置換するには、ステートメントの許可 ID が既存のシーケンスの所有者でなければなりません (SQLSTATE 42501)。

構文

構文図を読む構文図をスキップするCREATEOR REPLACE SEQUENCEsequence-nameAS INTEGERASdata-typeSTART WITHnumeric-constantINCREMENT BY 1INCREMENT BYnumeric-constantNO MINVALUEMINVALUEnumeric-constantNO MAXVALUEMAXVALUEnumeric-constantNO CYCLECYCLECACHE 20CACHEinteger-constantNO CACHENO ORDERORDER
data-type
構文図を読む構文図をスキップするbuilt-in-typedistinct-type-name1
built-in-type
構文図を読む構文図をスキップするSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)
注:
  • 1 指定した特殊タイプは、いかなるデータ・タイプ制約も持つことができません。また、ソース・タイプがアンカー・データ・タイプであってはなりません。

説明

OR REPLACE
シーケンスの定義が現行のサーバー上に存在している場合に、そのシーケンスの定義を置換するために指定します。 既存の定義は、新しい定義がカタログ内で置換される前に効率的にドロップされます。ただし、シーケンスに対して付与された特権は影響を受けないという例外があります。 このオプションは、シーケンスの定義が現行のサーバー上に存在しない場合は無視されます。 このオプションは、オブジェクトの所有者しか指定できません。
sequence-name
シーケンスを指定します。 名前の組み合わせ、また暗黙および明示スキーマ名は、 現行のサーバーに存在するシーケンスを識別することはできません (SQLSTATE 42710)。

sequence-name の非修飾形式は SQL ID です。 修飾フォームは、ピリオドと SQL ID が後ろに続く修飾子です。 修飾子はスキーマ名です。

シーケンス名がスキーマ名で明示的に修飾されている場合、 そのスキーマ名の先頭を SYS にすると、エラーが起こります (SQLSTATE 42939)。

AS data-type
シーケンス値に使用されるデータ・タイプを指定します。 データ・タイプは、ゼロの位取りの整数値タイプ (SMALLINT、INTEGER、BIGINT、または DECIMAL) か、 ソース・タイプがゼロの位取りの整数値タイプであるユーザー定義の特殊タイプまたは参照タイプにすることができます (SQLSTATE 42815)。 指定した特殊タイプは、いかなるデータ・タイプ制約も持つことができません。また、ソース・タイプがアンカー・データ・タイプであってはなりません (SQLSTATE 428H2)。デフォルトは INTEGER です。
START WITH numeric-constant
シーケンスの最初の値を指定します。 この値は、小数点の右側に非ゼロの数字がない (SQLSTATE 428FA) かぎり、シーケンスに関連する データ・タイプの列に割り当てられる正または負の値にすることができます (SQLSTATE 42815)。デフォルトは、昇順シーケンスであれば MINVALUE、降順シーケンスであれば MAXVALUE です。

この値は、シーケンスの最大または最小値に達した後、そのシーケンスが循環する 値である必要はありません。 START WITH 節を使用して、循環に使用される範囲外のシーケンスを開始することができます。 循環に使用される範囲は、MINVALUE および MAXVALUE によって定義されています。

INCREMENT BY numeric-constant
連続したシーケンス値のインターバルを指定します。 この値は、シーケンスに関連する データ・タイプの列に割り当てられる正または負の値にすることができます (SQLSTATE 42815)。この値は、長精度整数定数の値を超えてはならず (SQLSTATE 42820)、 また小数点の右側にゼロ以外の数字があってはなりません (SQLSTATE 428FA)。

この値が負の場合、これは降順シーケンスです。 この値が 0 の場合、または正の場合は、 昇順になります。 デフォルトは 1 です。

MINVALUE または NO MINVALUE
降順シーケンスが値の生成を循環または停止する最小値、あるいは最大値に達した後、 昇順シーケンスが循環する最小値を指定します。
MINVALUE numeric-constant
最小値にする数値定数を指定します。 この値は、小数点の右側に非ゼロの数字がない (SQLSTATE 428FA) かぎり、シーケンスに関連する データ・タイプの列に割り当てられる正または負の値にすることができます (SQLSTATE 42815) が、 最大値以下でなければなりません (SQLSTATE 42815)。
NO MINVALUE
昇順シーケンスの場合、値は START WITH 値で、START WITH が指定されない場合には 1 です。 降順シーケンスの場合、シーケンスに関連するデータ・タイプの最小値です。 これはデフォルトです。
MAXVALUE または NO MAXVALUE
昇順シーケンスが値の生成を循環または停止する最大値、あるいは最小値に達した後、 降順シーケンスが循環する最大値を指定します。
MAXVALUE numeric-constant
最大値にする数値定数を指定します。 この値は、小数点の右側に非ゼロの数字がない (SQLSTATE 428FA) かぎり、 シーケンスに関連するデータ・タイプの列に割り当てられる正または負の値にすることができます (SQLSTATE 42815) が、 最小値以上でなければなりません (SQLSTATE 42815)。
NO MAXVALUE
昇順シーケンスの場合、値はシーケンスに関連するデータ・タイプの最大値です。 降順シーケンスの場合、値は START WITH 値で、START WITH が指定されない場合には -1 です。
CYCLE または NO CYCLE
その最大値または最小値に達した後、シーケンスが値の生成を続行するかどうかを指定します。 次の値が境界条件を正確に満たしたとき、またはその値を超えることによって、シーケンスの境界に達します。
CYCLE
最大値または最小値に達した後、このシーケンスについて値の生成を続行することを指定します。 このオプションが使用されると、昇順シーケンスが最大値に達した後、その最小値が生成されます。 降順シーケンスが最小値に達した後、その最大値が生成されます。 シーケンスの最大値および最小値は、循環に使用される範囲を決定します。

CYCLE が有効な場合、重複するシーケンス値が生成される場合があります。

NO CYCLE
シーケンスの最大値または最小値に達した後、そのシーケンスについて値は生成されないことを指定します。 これはデフォルトです。
CACHE または NO CACHE
高速アクセスのため、事前割り振り値のいくつかをメモリーに保管するかどうかを指定します。 これはパフォーマンスおよびチューニング・オプションです。
CACHE integer-constant
事前割り振りされ、メモリーに保管されるシーケンス値の最大数を指定します。 値を事前割り振りしてキャッシュに保管しておくと、シーケンス値を生成するとき、 ログへの同期入出力が少なくなります。

システム障害が起こると、コミットされたステートメントで使用されていない キャッシュ済みシーケンス値はすべて失われます (使用されなくなります)。 CACHE オプションに指定する値は、システム障害の際に失われても構わないシーケンス値の最大数です。

最小値は 2 です (SQLSTATE 42815)。 デフォルト値は CACHE 20 です。

CACHE オプションと NO ORDER オプションを使用すれば、シーケンス値を同時に複数のキャッシュに入れることが可能になります。複数パーティション環境では、複数のメンバーによるキャッシュが可能です。

NO CACHE
シーケンスの値が事前割り振りされないよう指定します。 システム障害、シャットダウン、またはデータベース非活動化の際、 値が失われることはありません。 このオプションが指定されると、シーケンスの値はキャッシュに保管されません。 この場合、シーケンスの新しい値が要求されるたびに、ログに対して同期入出力が行われます。
NO ORDER または ORDER
要求の順序でシーケンス番号が生成されるかどうかを指定します。
ORDER
要求の順序でシーケンス番号が生成されるよう指定します。
NO ORDER
シーケンス番号を要求の順序どおりに生成する必要がないことを指定します。これはデフォルトです。

  • 定数シーケンス (常に定数値を返す) を定義することも可能です。 これは、INCREMENT 値にゼロを指定して START WITH 値には MAXVALUE を超えない値を指定するか、 あるいは START WITH、MINVALUE、および MAXVALUE に同じ値を指定することによって実行できます。 定数シーケンスの場合には、シーケンスに関する NEXT VALUE が呼び出されるたびに、同じ値が戻ります。 定数シーケンスは、数値グローバル変数として使用することができます。 ALTER SEQUENCE を使用すると、定数シーケンスのために生成される値を調整することができます。
  • ALTER SEQUENCE ステートメントを使用して、シーケンスを手動で循環させることができます。 NO CYCLE が暗黙的または明示的に指定されている場合、 ALTER SEQUENCE ステートメントでシーケンスを再始動または拡張し、 そのシーケンスの最大または最小値に達した後でも値の生成を続行できます。
  • CYCLE キーワードを指定して、シーケンスが循環するように明示的に指定できます。 シーケンスを定義する際に CYCLE オプションを使用して、 生成された値が境界に達するたびに循環するよう指示します。 シーケンスが自動的に循環するように定義されると (つまり CYCLE が明示的に指定された場合)、 増分値が 1 または -1 以外の場合には、シーケンスに対して生成される最大または最小値は、 実際に指定された MAXVALUE または MINVALUE ではない可能性があります。 例えば、START WITH=1, INCREMENT=2, MAXVALUE=10 と定義されたシーケンスは、 最大値 9 を生成し、値 10 は生成しないはずです。 シーケンスに CYCLE を定義する際、MINVALUE、MAXVALUE、および START WITH の値への影響を考慮してください。
  • シーケンス番号のキャッシュは、シーケンス番号の範囲を高速アクセスのために メモリーに保管することを意味しています。 アプリケーションが、次のシーケンス番号をキャッシュから割り振ることができるシーケンスに アクセスしていると、シーケンス番号の割り振りは素早く行われます。 ただし、次のシーケンス番号をキャッシュから割り振ることができないシーケンスにアクセスしている場合、 シーケンス番号の割り振りは、永続記憶域への入出力操作を待機しなければならない場合があります。 CACHE の値を選択するとき、パフォーマンスとアプリケーション要件の関係を考慮しておく必要があります。
  • シーケンスの定義者には、WITH GRANT OPTION 付きの ALTER および USAGE 特権が付与されます。シーケンスの所有者はシーケンスをドロップできます。
  • 複数パーティション環境に関する考慮事項:
    • CACHE オプションと NO ORDER オプションが有効になっていると、複数のキャッシュが同時にアクティブになることがあります。複数パーティションの各メンバーで、そのようなことが起こり得ます。 別々のメンバーから次の値の割り当て要求があると、値の割り当てが厳密な数値順にならない可能性があります。例えば、複数パーティション環境で、メンバー DB1A と DB1B が同じシーケンスを使用し、DB1A がキャッシュ値 1 から 20 を取得し、DB1B がキャッシュ値 21 から 40 を取得するとします。このシナリオで、最初に DB1A が次の値を要求し、次に DB1B が要求し、その後 DB1A が再度要求すると、割り当てられる値の実際の順序は 1、21、2 になります。 そのため、同じ順序を同時に使用する複数のメンバーの間でシーケンス番号が必ず厳密な数字順で生成されるようにするには、ORDER オプションを指定します。

1 で始まり、1 つずつ増分し、循環しない、 同時に 24 の値をキャッシュに入れる ORG_SEQ というシーケンスを作成します。
   CREATE SEQUENCE ORG_SEQ
     START WITH 1
     INCREMENT BY 1
     NO MAXVALUE
     NO CYCLE
     CACHE 24