CREATE SEQUENCE
CREATE SEQUENCE ステートメントはアプリケーション・サーバーでシーケンスを作成します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- スキーマ内に作成する特権。詳しくは、スキーマ内で作成する必要のある権限を参照してください。
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- 次のシステム権限
- データ域作成 (CRTDTAARA) コマンドに対する *USE 権限
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- SYSSEQOBJECTS カタログ表の場合
- 該当の表に対する INSERT 特権、および
- QSYS2 ライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
特殊タイプを参照する場合は、ステートメントの権限 ID によって保持される 特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別される特殊タイプに対しては次のもの。
- その特殊タイプに対する USAGE 特権、および
- その特殊タイプを含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
既存のシーケンスに置き換えるには、ステートメントの権限 ID が保持する特権に、次のうち少なくともいずれか 1 つを含める必要があります。
- 次のシステム権限
- シーケンスに関連したデータ域に対する *OBJMGT システム権限
- このシーケンスを削除するために必要な全権限
- SYSSEQOBJECTS カタログ表に対する *READ システム権限
- データベース管理者権限
SQL 特権に対応するシステム権限の説明については、『シーケンスへの権限を検査する際の対応するシステム権限』および 『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-CREATE--+------------+--SEQUENCE--sequence-name--------------> '-OR REPLACE-' .--------------------------------------------. V (1) | >----+------------------------------------+-----+-------------->< | .-INTEGER---. | +-AS--+-data-type-+------------------+ +-START WITH--numeric-constant-------+ | .-1----------------. | +-INCREMENT BY--+-numeric-constant-+-+ | .-NO MINVALUE----------------. | +-+-MINVALUE--numeric-constant-+-----+ | .-NO MAXVALUE----------------. | +-+-MAXVALUE--numeric-constant-+-----+ | .-NO CYCLE-. | +-+-CYCLE----+-----------------------+ | .-CACHE--20---------------. | +-+-NO CACHE----------------+--------+ | '-CACHE--integer-constant-' | | .-NO ORDER-. | '-+-ORDER----+-----------------------'
- 同じ文節を複数回指定することはできません。
data-type |--+-built-in-type------+---------------------------------------| '-distinct-type-name-' built-in-type |--+-+---SMALLINT---+---------------------------+---------------| | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)-----------------. | '-+-+-DECIMAL-+-+--+-----------------------+-' | '-DEC-----' | | .-,0-. | '-+-NUMERIC-+-' '-(--integer--+----+--)-' '-NUM-----'
説明
- OR REPLACE
- 現行サーバーにこのシーケンスの定義が存在する場合に、その定義を置き換える、という動作を指定します。実際には、カタログで既存の定義を削除してから新しい定義に置き換える、という動作になりますが、例外として、このシーケンスに対して与えられていた特権は影響を受けません。現行サーバーにこのシーケンスの定義が存在しなければ、このオプションは無視されます。
- sequence-name
- シーケンスを指定します。
暗黙的または明示的修飾子も含め、この名前で、現行サーバーに既に存在しているシーケンスまたはデータ域を識別することはできません。
修飾されたシーケンス名を指定する場合、スキーマ名 は、QSYS2、
QSYS、または SYSIBM にはできません。
SQL 名が指定されている場合、シーケンスは、暗黙的または明示的修飾子で指定しているスキーマ内に作成されます。
システム名が指定されている場合、シーケンスは、修飾子で指定しているスキーマ内に作成されます。 修飾されない場合:
- CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、シーケンスは、 現行ライブラリー (*CURLIB) 内に作成されます。
- そうでない場合、シーケンスは現行スキーマ内に作成されます。
- ASdata-type
- シーケンス値に使用するデータ・タイプを指定します。 データ・タイプは、厳密に位取りがゼロの数値タイプ (SMALLINT、INTEGER、BIGINT、DECIMAL、または NUMERIC)、またはソース・タイプが厳密に位取りがゼロの 数値タイプであるユーザー定義の特殊タイプにすることができます。 デフォルトは INTEGER です。
- built-in-type
- シーケンスの内部表示のベースとして使用される組み込みデータ・タイプを指定します。
データ・タイプが DECIMAL または NUMERIC である場合、精度は 63 以下、位取りは 0 でなければなりません。
各組み込みデータ・タイプについての詳細は、CREATE TABLEを参照してください。
プラットフォーム間でのアプリケーションの移植性を保つには、NUMERIC データ・タイプの代わりに DECIMAL を使用します。
- distinct-type-name
- シーケンスのデータ・タイプが、特殊タイプ (ユーザー定義のデータ・タイプ) であることを指定します。ソース・タイプが DECIMAL または NUMERIC である場合、 シーケンスの精度は該当する特殊タイプのソース・タイプの精度になります。 ソース・タイプの精度は 63 以下、また位取りは 0 でなければなりません。 スキーマ名なしの特殊タイプを指定すると、その特殊タイプ名は、SQL パス上のスキーマを検索することで解決されます。
- START WITH numeric-constant
- シーケンスについて生成される最初の値を指定します。
小数点の右側にゼロ以外の数字がないことを条件として、シーケンスに関連したデータ・タイプの列に割り当てる
ことのできる任意の正または負の値を指定できます。
シーケンスを定義するときに値を明示的に指定していない場合、デフォルト 値は、昇順の場合は MINVALUE で降順の場合は MAXVALUE です。
この値は、シーケンスが最大値または最小値に達した後で、シーケンス の循環により到達する値になるとは限りません。 START WITH 文節を使用することにより、この循環に使用される値の範囲外の 値からシーケンスを開始することができます。 循環に使用する範囲は、MINVALUE および MAXVALUE で定義します。
- INCREMENT BYnumeric-constant
- シーケンスの連続した値の間隔を指定します。
小数点の右側にゼロ以外の数字がないことと、長精度整数定数の値を超えないことを条件として、シーケンスに関連したデータ・タイプの列に割り当てることのできる任意の正または負の値を指定できます。
この値が 0 または正の場合は、昇順になります。この値が負の場合は、降順になります。デフォルトは、1 です。
- NO MINVALUE または MINVALUE
- 降順シーケンスが値の生成を循環または停止する最小値、あるいは最大値に達した後、
昇順シーケンスが循環する最小値を指定します。
デフォルトは NO MINVALUE です。
- NO MINVALUE
- 昇順シーケンスの場合、値は START WITH 値であり、 START WITH が指定されていない場合は 1 です。 降順シーケンスの場合、シーケンスに関連するデータ・タイプ (および精度 (DECIMAL または NUMERIC の場合)) の最小値です。
- MINVALUEnumeric-constant
- 最小値を示す数値定数を指定します。小数点の右側にゼロ以外の数字がないことを条件として、 シーケンスに関連したデータ・タイプの列に割り当てることのできる任意の正または負の値を指定できます。 値は、最大値またはそれより小さい値でなければなりません。
- NO MAXVALUE または MAXVALUE
- 昇順シーケンスが値の生成を循環または停止する最大値、あるいは最小値に達した後、
降順シーケンスが循環する最大値を指定します。
デフォルトは NO MAXVALUE です。
- NO MAXVALUE
- 昇順シーケンスの場合、シーケンスに関連するデータ・タイプ (および精度 (DECIMAL または NUMERIC の場合)) の最大値です。 降順シーケンスの場合、値は START WITH 値であり、START WITH が指定されていない場合は -1 です。
- MAXVALUE numeric-constant
- 最大値を示す数値定数を指定します。小数点の右側にゼロ以外の数字がないことを条件として、 シーケンスに関連したデータ・タイプの列に割り当てることのできる任意の正または負の値を指定できます。 値は、最小値またはそれより大きい値でなければなりません。
- NO CYCLE または CYCLE
- シーケンスの最大値または最小値に達した後も、このシーケンスで値を生成し続けるかどうかを指定します。デフォルトは NO CYCLE です。
- NO CYCLE
- シーケンスの最大値または最小値に達した後は、このシーケンスについて 値を生成しないことを指定します。
- CYCLE
- 最大値または最小値に達した後も、このシーケンスの値を生成し続けることを指定します。
このオプションを使用した場合は、昇順シーケンスがシーケンスの最大値に
達した後では、最小値が生成されます。
降順シーケンスがシーケンスの最小値に達した後は、最大値が生成されます。
列の最大値と最小値によって、循環に使用される範囲が決まります。
CYCLE が有効になっていると、シーケンスで重複値が生成される可能性があります。
- CACHE または NO CACHE
- 事前割り振りの値をメモリー内に保持するかどうかを指定します。
値を事前に割り振ってキャッシュに保管しておくと、NEXT VALUE シーケンス式のパフォーマンスが向上します。
デフォルトは CACHE 20 です。
- CACHE integer-constant
- 事前割り振りされてメモリーに保持されるシーケンス値の最大数を指定します。
値を事前割り振りしてキャッシュに保管することにより、パフォーマンスが向上します。
システム障害のような特定の状態になると、キャッシュに保管されていてコミット済みステートメントでまだ使用されていないシーケンス値はすべて失われるため、その後使用されることはありません。 CACHE オプションに指定する値は、こうした状態で失われる可能性のあるシーケンス値の最大数です。
指定できる最小の値は 2 です。
- NO CACHE
- シーケンスの値を事前割り振りしないことを指定します。 NO CACHE を指定すると、 CACHE を指定した場合よりも NEXT VALUE シーケンス式のパフォーマンスが低下します。
- ORDER または NO ORDER
- シーケンス値を要求された順序で生成するかどうかを指定します。
デフォルトは NO ORDER です。
- NO ORDER
- シーケンス番号を要求の順序どおりに生成する必要がないことを指定します。
- ORDER
- シーケンス番号を要求の順序どおりに生成するように指定します。ORDER を指定すると、 NO ORDER を指定した場合よりも NEXT VALUE シーケンス式のパフォーマンスが低下します。
注
シーケンス属性: シーケンスが *DTAARA オブジェクトとして作成されます。 SQL を通して SQL シーケンスを使用した場合に予期しない失敗または予期しない結果が生じる可能性があるため、 Change Data Area (*CHGDTAARA) または他の同様のインターフェースを使用して *DTAARA オブジェクトを変更しないでください。
シーケンス所有権: シーケンスの所有者 は、ステートメントを実行するスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。
シーケンスの権限 : SQL 名を使用する場合は、シーケンスは、 *PUBLIC に対するシステム権限 *EXCLUDE を使用して作成されます。 システム名を使用する場合、シーケンスは、スキーマの作成権限 (CRTAUT) パラメーターによって決められる *PUBLIC に対する権限を使用して作成されます。
シーケンスの所有者がグループ・プロファイルのメンバー (GRPPRF キーワード) であ り、グループ権限が指定されている (GRPAUT キーワード) 場合は、そのグル ープ・プロファイルにも、そのシーケンスに対する権限が与えられます。
- 既存のコメントまたはラベルは破棄されます。
- 権限を持つユーザーは維持されます。オブジェクト所有者は変更される可能性があります。
- 現在のジャーナル監査は保持されます。
MINVALUE と MAXVALUE の関係: 通常、MINVALUE は MAXVALUE より小さくなりますが、 これは必須ではありません。 MINVALUE が MAXVALUE と等しくなる場合もあります。 START WITH が MINVALUE および MAXVALUE と同じ値になっていて、CYCLE が暗黙的または明示的に指定された場合、これは定数シーケンスになります。 この場合、シーケンスによって生成されるすべての値は実際は同じであるため、 次の値を要求することは何の効果もありません。
MINVALUE は MAXVALUE 以下でなければなりません。
定数シーケンスの定義: 常に定数値を返すシーケンスを定義することも可能です。 これは、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 を定義する際、 (アプリケーションを他のベンダー・プラットフォームから DB2® に変換するための) アプリケーション変換ツールは、 MINVALUE、MAXVALUE および START WITH も明示的に指定する必要があります。
シーケンス番号のキャッシュ: シーケンス番号の範囲を高速アクセスのために メモリーに保管できます。 アプリケーションが、次のシーケンス番号をキャッシュから割り振ることができるシーケンスに アクセスすると、シーケンス番号の割り振りは素早く行われます。 ただし、次のシーケンス番号をキャッシュから割り振ることができないシーケンスにアクセスする場合、 シーケンス番号の割り振りは、*DTAARA オブジェクトの更新を必要とします。
CACHE に高い値を選択することによって、連続したシーケンス番号へのより高速なアクセスが許可されます。 ただし、失敗した場合、キャッシュ内のすべてのシーケンス値が失われます。 NO CACHE オプションを使用する場合、シーケンスの値はシーケンス・キャッシュに保管されません。 この場合、シーケンスにアクセスするたびに *DTAARA オブジェクトの更新が必要になります。 CACHE の値を選択する場合、パフォーマンス要件とアプリケーション要件との間のトレードオフを考慮に入れる必要があります。
最後に生成されたシーケンス値の持続性: データベース・マネージャーは、 SQL セッション内で最後に生成されたシーケンスの値を覚えていて、この値を PREVIOUS VALUE 式に対して戻し、シーケンス名を指定します。 この値は、シーケンス用に次の値が生成されるまで、またはシーケンスが除去、変更、あるいは置き換えられるまで、またはアプリケーション・セッションの終わりまで持続します。この値は COMMIT ステートメントおよび ROLLBACK ステートメントの影響を受けません。
PREVIOUS VALUE を定義して、アプリケーション・セッション内でリニアな有効範囲を持つようにします。 このため、ネストされたアプリケーションでは、
- ネストされた関数、プロシージャー、またはトリガーへの入り口で、 ネストされたアプリケーションは、シーケンスに対して最後に生成された値を継承します。 つまり、ネストされたアプリケーションで PREVIOUS VALUE 式の呼び出しを指定した場合、 ネストされたアプリケーションに入る前に、呼び出されるアプリケーション、ルーチン、またはトリガーで実行されるシーケンス活動が反映されます。ネストされたアプリケーションで PREVIOUS VALUE 式を呼び出した場合、 指定されたシーケンスの NEXT VALUE 式が、 呼び出されるアプリケーション、ルーチン、またはトリガーで実行されていないと、エラーが生じます。
- 関数、プロシージャー、またはトリガーから戻る際に、関数内のシーケンス・アクティビティーは、 呼び出されるアプリケーション、ルーチン、またはトリガーに影響します。 つまり、ネストされたアプリケーションから戻された後に、 呼び出されるアプリケーション、ルーチン、またはトリガーで PREVIOUS VALUE 式の呼び出しを指定した場合、 低いレベルのアプリケーションで発生したシーケンス・アクティビティーが反映されます。
- QDFTJRN と呼ばれるデータ域がシーケンスが作成されたのと同一のスキーマに存在し、ユーザーがそのデータ域に対する権限を持っていると、以下のすべてが当てはまる場合、ジャーナリングがデータ域で指定されたジャーナルに対して開始されます。
- 表の識別されたスキーマは、QSYS、QSYS2、QRECOVERY、QSPL、 QRCL、QRPLOBJ、QGPL、QTEMP、SYSIBM、またはこれらのライブラリーと同等の IASP であってはなりません。
- データ域で指定されたジャーナルが存在していなければならず、 ユーザーはジャーナルに対してジャーナリングを開始する権限を持っていなければなりません。
- データ域の最初の 10 バイトには、 ジャーナルを検索するスキーマの名前が含まれている必要があります。
- 次の 10 バイトにはジャーナルの名前が含まれている必要があります。
- 残りのバイトには、暗黙的にジャーナルに記録されるオブジェクト・タイプと、いつ暗黙的ジャーナリングを行うかに関係のあるオプションが含まれます。 オブジェクト・タイプには値 *DTAARA または *ALL を含める必要があります。値 *NONE を使用して、ジャーナリングが開始しないようにすることができます。
- シーケンスを指定した (STRJRNLIB コマンドを使用して) スキーマ内に作成すると、ジャーナリングが暗黙的に開始されます。
代替構文: 以下のキーワードは、他の DB2 製品の旧リリースとの互換性を維持するためにサポートされている同義語です。これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード NOMINVALUE、NOMAXVALUE、NOCYCLE、NOCACHE、および NOORDER を、 NO MINVALUE、NO MAXVALUE、NO CYCLE、NO CACHE、および NO ORDER の同義語として使用することができます。
- コンマは、複数のシーケンス・オプションを分離するのに使用できます。
例
1 で始まり、1 つずつ増分し、循環しない、 同時に 24 の値をキャッシュに入れる ORG_SEQ というシーケンスを作成します。
CREATE SEQUENCE ORG_SEQ
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24
START WITH 1、INCREMENT 1、NO MAXVALUE、NO CYCLE の各オプションは、それぞれ明示的に指定しない場合に使用される値です。