シーケンス参照

シーケンス参照は、アプリケーション・サーバーで定義されたシーケンスを参照する式です。

sequence-reference
Read syntax diagramSkip visual syntax diagramnextval-expressionprevval-expression
nextval-expression
Read syntax diagramSkip visual syntax diagramNEXT VALUE FORsequence-name
prevval-expression
Read syntax diagramSkip visual syntax diagramPREVIOUS VALUE FORsequence-name
sequence-name の NEXT VALUE
NEXT VALUE 式は、 sequence-name で指定されたシーケンスの次の値を生成して返します。
sequence-name の前の値
PREVIOUS VALUE 式は、現行アプリケーション・プロセス内の直前の ステートメントに指定されたシーケンスについて最後に生成された値を返します。 この値は、シーケンスの名前が指定されている PREVIOUS VALUE 式を使用して、繰り返し参照することができます。 単一ステートメント内に同じシーケンスを指定している PREVIOUS VALUE 式のインスタンスが複数存在する可能性があり、 それらはすべて同じ値を返します。 パーティション・データベース環境では、 最も新しく生成された値が PREVIOUS VALUE 式によって返されない場合があります。

同じシーケンス名が指定されている NEXT VALUE 式が既に現行アプリケーション・プロセスで、 現在または前のトランザクションで参照されている場合のみ、 PREVIOUS VALUE 式を使用できます (SQLSTATE 51035)。

  • 許可: ステートメントで sequence-reference を使用する場合は、 ステートメントの許可 ID が保持する特権に、 以下の特権が少なくとも 1 つ含まれている必要があります。
    • シーケンスに対する USAGE 特権
    • DATAACCESS 権限
  • NEXT VALUE 式がシーケンスの名前を指定していれば、そのシーケンスの新しい値が生成されます。 ただし、照会の中に同じシーケンス名を指定している NEXT VALUE 式のインスタンスが 複数ある場合、シーケンスのカウンターは結果の行ごとに 1 つずつ増えていき、 NEXT VALUE のすべてのインスタンスが結果の行に同じ値を戻します。
  • 以下の例に示すように、同じシーケンス番号を、 2 つの異なる表のユニーク・キー値として使用することができます。 これは、最初の行では NEXT VALUE 式 (これはシーケンス値を生成します) で、 その他の行では PREVIOUS VALUE 式 (PREVIOUS VALUE のインスタンスは現行セッションで最後に生成された シーケンス値を参照します) でシーケンス番号を参照することによって可能になります。
       INSERT INTO order(orderno, cutno)
         VALUES (NEXT VALUE FOR order_seq, 123456);
    
       INSERT INTO line_item (orderno, partno, quantity)
         VALUES (PREVIOUS VALUE FOR order_seq, 987654, 1);
  • NEXT VALUE 式と PREVIOUS VALUE 式は、以下の位置に指定できます。
    • select-statement または SELECT INTO ステートメント (ステートメントに DISTINCT キーワード、 GROUP BY 節、ORDER BY 節、UNION キーワード、INTERSECT キーワード、 または EXCEPT キーワードが入っていなければ、select-clause 内)
    • INSERT ステートメント (VALUES 節内)
    • INSERT ステートメント (全選択の select-clause 内)
    • UPDATE ステートメント (SET 節内 (検索条件付き、 または位置指定 UPDATE ステートメントのいずれか)、 ただし NEXT VALUE は SET 節にある式の全選択の select-clause 内に指定できない)
    • SET 変数ステートメント (式の全選択の select-clause 内を除きます。 トリガー内に NEXT VALUE 式を指定することができますが、PREVIOUS VALUE 式は指定できません)。
    • VALUES INTO ステートメント (式の全選択の select-clause 内)
    • CREATE PROCEDURE ステートメント (SQL プロシージャーのルーチン本体内)
    • トリガー・アクション内の CREATE TRIGGER ステートメント (NEXT VALUE 式は指定できるが、 PREVIOUS VALUE 式は指定できない)
  • NEXT VALUE 式と PREVIOUS VALUE 式は、以下の位置には指定できません。
    • 完全外部結合の結合条件
    • CREATE TABLE または ALTER TABLE ステートメント内の列の DEFAULT 値
    • CREATE TABLE ステートメントまたは ALTER TABLE ステートメント内の生成列定義
    • CREATE TABLE または ALTER TABLE ステートメント内のサマリー表定義
    • CHECK 制約の条件
    • CREATE TRIGGER ステートメント (NEXT VALUE 式は指定できるが、 PREVIOUS VALUE 式は指定できない)
    • CREATE VIEW ステートメント
    • CREATE METHOD ステートメント
    • CREATE FUNCTION ステートメント
    • XMLQUERY、XMLEXISTS、または XMLTABLE 式の引数リスト
  • また、以下の位置に NEXT VALUE 式を指定することはできません (SQLSTATE 428F9)。
    • CASE 式
    • 総計関数のパラメーター・リスト
    • 前述のような明らかに指定できるものを除くコンテキスト内の副照会
    • 外部 SELECT に DISTINCT 演算子を備えた SELECT ステートメント
    • 結合の結合条件
    • 外部 SELECT に GROUP BY 節を備えた SELECT ステートメント
    • 外部 SELECT が UNION、INTERSECT、または EXCEPT セット演算子を使用して他の SELECT ステートメントと組み合わされている場合の SELECT ステートメント
    • ネストされた表の式
    • 表関数のパラメーター・リスト
    • 最外部の SELECT ステートメントか、DELETE または UPDATE ステートメントの WHERE 節
    • 最外部の SELECT ステートメントの ORDER BY 節
    • UPDATE ステートメントの SET 節にある式の全選択の select-clause
    • IF, WHILE, DO ... UNTIL、CASE の各ステートメント (SQL ルーチン内)
  • シーケンスについて値が生成されると、その値を再使用できなくなるため、 次に値が要求されたときに新しい値が生成されます。 NEXT VALUE 式が組み込まれているステートメントが失敗した場合やロールバックされた場合でも、 これが当てはまります。

    列の VALUES リストにある NEXT VALUE 式が INSERT ステートメントに組み込まれており、 INSERT 実行中のある時点でエラー (次のシーケンス値を生成しているときの問題、 あるいは別の列の値に問題があると考えられる) が起こった場合、 挿入は失敗し (SQLSTATE 23505)、 シーケンスについて生成した値は再使用できないものと見なされます。 場合によっては、同じ INSERT ステートメントを再発行することによって、 正しく動作します。

    例えば、NEXT VALUE が使用されていた列のユニーク索引が存在する結果としてエラーが起こり、 既に生成されているシーケンス値がその索引に存在するとします。 シーケンスについて生成される次の値は、索引には存在しない値になることが考えられるため、 後続の INSERT が正しく動作します。

  • PREVIOUS VALUE の有効範囲: PREVIOUS VALUE の値は、現行セッション内のシーケンスに次の値が生成されるか、シーケンスのドロップまたは変更が行われるか、またはアプリケーション・セッションが終了するまで持続します。 この値は COMMIT または ROLLBACK ステートメントの影響を受けません。 直接 PREVIOUS VALUE の値を設定することはできず、シーケンスに関する NEXT VALUE 式の実行結果として得られます。

    特にパフォーマンスの目的で広く使用されている技法として、アプリケーションまたは製品に接続のセットを管理させ、トランザクションを任意の接続へ経路指定する、というものがあります。 このような場合には、シーケンスに関する PREVIOUS VALUE の可用性への依存を、トランザクションの終わりまでに限る必要があります。 このタイプの状態が生じる可能性のある例としては、XA プロトコル、接続プール、接続コンセントレーター、および HADR を使用してフェイルオーバーを行うアプリケーションが含まれます。

  • シーケンスの値の生成において、 そのシーケンスが最大値 (または降順シーケンスの最小値) に達し、 循環が許可されていない場合、エラーが起こります (SQLSTATE 23522)。 この場合、ユーザーはシーケンスを ALTER して許容値の範囲を拡張、 またはシーケンスの循環を可能にでき、あるいは値の範囲がより大きな、 異なるデータ・タイプを持つ新しいシーケンスを DROP および CREATE することができます。

    例えば、シーケンスがデータ・タイプ SMALLINT で定義されていて、その結果、 そのシーケンスが割り当て可能な値を使い果たしてしまうことがあります。 シーケンスを新しい定義で DROP および再作成して、 そのシーケンスを INTEGER として再定義しなければならない場合があります。

  • カーソルの SELECT ステートメント内の NEXT VALUE に対する参照は、 結果表の行について生成される値を参照します。 データベースから取り出される行ごとに NEXT VALUE 式のシーケンス値が生成されます。 クライアントでブロッキングを行うと、 サーバーで FETCH ステートメントの処理の前に値が生成されることがあります。 この状況は、結果表の行がブロッキングされている場合に生じることがあります。 クライアント・アプリケーションが、データベースでマテリアライズされている行をすべて明示的に FETCH しないと、 (マテリアライズされている行のうち戻されなかったものの) シーケンス値が生成されません。
  • カーソルの SELECT ステートメント内の PREVIOUS VALUE に対する参照は、 そのカーソルをオープンする前に、生成された指定シーケンスの値を参照します。 しかしながら、カーソルをクローズすると、後続するステートメント内の、 PREVIOUS VALUE によって戻される指定シーケンスの値に影響が生じることがあります。 このことは、カーソルを再オープンした同じステートメントの場合でも生じることがあります。 カーソルの SELECT ステートメントに入っている NEXT VALUE に対する参照中のシーケンス名が同じである場合はこのようになります。
  • 代替構文: 以前のバージョンの Db2® および他のデータベース製品との互換性のために、以下がサポートされています。 これらの代替は非標準であり、使用すべきではありません。
    • NEXTVAL と PREVVAL は、NEXT VALUE と PREVIOUS VALUE の代わりに指定できます。
    • NEXT VALUE FOR sequence-name の代わりに sequence-name.NEXTVAL を指定できます。
    • PREVIOUS VALUE FOR sequence-name の代わりに sequence-name.CURRVAL を指定できます。

"order" という表があり、 "order_seq" という以下のようなシーケンスが作成されると想定します。
   CREATE SEQUENCE order_seq
     START WITH 1
     INCREMENT BY 1
     NO MAXVALUE
     NO CYCLE
     CACHE 24
以下は、NEXT VALUE 式で "order_seq" シーケンス番号を生成する方法例を示しています。
   INSERT INTO order(orderno, custno)
     VALUES (NEXT VALUE FOR order_seq, 123456);
または
   UPDATE order
     SET orderno = NEXT VALUE FOR order_seq
     WHERE custno = 123456;
または
   VALUES NEXT VALUE FOR order_seq INTO :hv_seq;