シーケンス参照

シーケンスは、NEXT VALUE および PREVIOUS VALUE 式を使用し、 シーケンスの名前を指定することによって参照されます。

構文図を読む構文図をスキップする
sequence-reference

|--+-nextval-expression-+---------------------------------------|
   '-prevval-expression-'   

nextval-expression

|--NEXT VALUE--FOR--sequence-name-------------------------------|

prevval-expression

|--PREVIOUS VALUE--FOR--sequence-name---------------------------|

シーケンスは、NEXT VALUE および PREVIOUS VALUE 式を使用し、 シーケンスの名前を指定することによって参照されます。

nextval-expression
NEXT VALUE 式は、指定したシーケンスの次の値を生成して戻します。 NEXT VALUE 式でシーケンスの名前を指定すると、シーケンスの新しい値が生成されます。 ただし、照会内で同じシーケンス名を指定する NEXT VALUE 式の複数インスタンスがある場合は、 結果の各行につき一度だけシーケンス値が増分され、 NEXT VALUE のすべてのインスタンスが、結果の行に対して同じ値を戻します。 NEXT VALUE は、シーケンス値の増分を生じさせるので、 それは外部アクションを伴う、非 deterministic 式です。

シーケンスの次の値が生成されたときに、シーケンスの論理範囲に対して、 昇順シーケンスの最大値または降順シーケンスの最小値が超過しており、 NO CYCLE オプションが有効である場合、エラーが戻されます。

NEXT VALUE 式の結果のデータ・タイプおよび長さ属性は、 指定したシーケンスのデータ・タイプおよび長さ属性と同じです。 結果が NULL になることはありません。

prevval-expression
PREVIOUS VALUE 式は、現行アプリケーション・プロセス内での 直前のステートメントについて、指定したシーケンスに最近生成された値を戻します。 この値は、PREVIOUS VALUE 式を使用し、シーケンスの名前を指定することによって、 繰り返し参照することができます。 単一ステートメント内で同じシーケンス名を指定している PREVIOUS VALUE 式の複数インスタンスがある場合もあり、 それらはすべて同じ値を戻します。

PREVIOUS VALUE 式を使用できるのは、同じシーケンス名を指定している NEXT VALUE が、 現行アプリケーション・プロセス内で既に参照されている場合だけです。

PREVIOUS VALUE 式の結果のデータ・タイプおよび長さ属性は、 指定したシーケンスのデータ・タイプおよび長さ属性と同じです。 結果が NULL になることはありません。

sequence-name
参照されるシーケンスを識別します。 シーケンス名 は、現行サーバーに存在するシーケンスを示すものでなければなりません。

許可: シーケンスがステートメント内で参照される場合、 ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

  • ステートメント内で識別されるシーケンスに対して、
    • シーケンスでの USAGE 特権、および
    • シーケンスが含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

SQL 特権に対応するシステム権限については、『シーケンスへの権限を検査する際の対応するシステム権限』を参照してください。

NEXT VALUE による値の生成: シーケンスに値が生成される際に、 その値は消費され、次回に値が要求されるときには、新しい値が生成されます。 このことは、NEXT VALUE 式を含むステートメントが失敗したりロールバックされた場合にも同様です。

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

アプリケーションや製品で特にパフォーマンス上の理由から通常使用されるのは、一群の接続を管理し、トランザクションを任意の接続に経路指定するという技法です。こうした状況では、シーケンスに対する PREVIOUS VALUE はそのトランザクションが終了するまでの間しか使用できません。

ユニーク・キー値としての使用: 2 つの別々の表内のユニーク・キー値として、 同じシーケンス番号を使用することができます。 そのためには、最初の行の NEXT VALUE 式と (これでシーケンス値が生成される)、 他の行の PREVIOUS VALUE 式でシーケンス番号を参照します。 (PREVIOUS VALUE のインスタンスは、現行セッションで最近生成されたシーケンス値を参照します。) この点を以下に示します。

  INSERT INTO ORDER (ORDERNO, CUSTNO)
    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 の使用許可: NEXT VALUE および PREVIOUS VALUE 式は、以下の場所に指定することができます。

  • ステートメントに DISTINCT キーワード、GROUP BY 文節、ORDER BY 文節、UNION キーワード、INTERSECT キーワード、または EXCEPT キーワードが含まれていない場合、 SELECT ステートメントまたは SELECT INTO ステートメントの選択文節
  • 全選択 の VALUES 文節内 (NEXT VALUE は使用できません)
  • INSERT ステートメントの VALUES 文節内。
  • INSERT ステートメントの全選択の選択文節 内。
  • 検索または定位置の UPDATE ステートメントの SET 文節内。 ただし、NEXT VALUE は、SET 文節内の式の副選択の選択文節 には指定できません。
    PREVIOUS VALUE 式は、UPDATE ステートメント内の SET 文節内の任意の場所に指定できますが、 NEXT VALUE 式を指定できるのは、 それが式の全選択の選択文節 内にあるのでなければ、SET 文節内だけです。 例えば、シーケンス式の次のような使用はサポートされます。
      UPDATE T SET C1 = (SELECT PREVIOUS VALUE FOR S1 FROM T)
    
      UPDATE T SET C1 = PREVIOUS VALUE FOR S1
    
      UPDATE T SET C1 = NEXT VALUE FOR S1
    シーケンス式の次のような使用はサポートされません。
      UPDATE T SET C1 = (SELECT NEXT VALUE FOR S1 FROM T)
  • 割り当てステートメント 内。ただし、式の全選択選択文節 内を除きます。シーケンス式の次のような使用はサポートされます。
      SET :ORDERNUM = NEXT VALUE FOR INVOICE
    
      SET :ORDERNUM = PREVIOUS VALUE FOR INVOICE
    シーケンス式の次のような使用はサポートされません。
      SET :X = (SELECT NEXT VALUE FOR S1 FROM T)
    
      SET :X = (SELECT PREVIOUS VALUE FOR S1 FROM T)
  • VALUES または VALUES INTO ステートメント内。 ただし、式の全選択の選択文節 内を除きます。
  • CREATE PROCEDURE ステートメントの SQL ルーチン本体 内。
  • CREATE TRIGGER ステートメントの SQL トリガー本体 内 (PREVIOUS VALUE は許可されません)。
  • CALL ステートメントの引数リスト内。
  • CREATE PROCEDURE または CREATE FUNCTION のデフォルト式内。NEXT VALUE または PREVIOUS VALUE を含んでいるデフォルトのある関数は、NEXT VALUE または PREVIOUS VALUE を直接指定できる場所でのみ使用できます。

NEXT VALUE および PREVIOUS VALUE の使用上の制限: NEXT VALUE および PREVIOUS VALUE 式は、以下の場所には指定できません。

  • CREATE TABLE または ALTER TABLE ステートメント内のマテリアライズ照会表の定義内。
  • CHECK 制約内。
  • ビュー定義内。
  • CREATE INDEX ステートメント内。
  • CREATE FUNCTION ステートメントの SQL ルーチン本体 内。

加えて、NEXT VALUE 式は、以下の場所には指定できません。

  • CASE 式
  • 集約関数のパラメーター・リスト
  • 明示的に許可されている場合を除き、コンテキスト内の副照会
  • 外側の SELECT に DISTINCT 演算子または GROUP BY 文節が含まれている場合の SELECT ステートメント
  • 外側の SELECT に、UNION、INTERSECT、または EXCEPT 演算子を使った別の SELECT ステートメントが結合している場合の SELECT ステートメント
  • OFFSET 文節を含む SELECT ステートメント。
  • 結合の結合条件
  • ネストされた表の式
  • 表関数のパラメーター・リスト
  • UPDATE ステートメントの SET 文節内の式の全選択の選択文節
  • 最外部の SELECT ステートメントか、DELETE または UPDATE ステートメントの WHERE 文節
  • 最外部の SELECT ステートメントの ORDER BY 文節
  • SQL ルーチン内の IF、WHILE、DO . . . UNTIL、または CASE ステートメント

カーソルを使ったシーケンス式の使用: 通常は、 SELECT NEXT VALUE FOR ORDER_SEQ FROM T1 が生成する結果表には、 シーケンス ORDER_SEQ から生成される値が、T1 から検索される行の数と同数、含まれます。 カーソルの SELECT ステートメント内の NEXT VALUE 式への参照は、 結果表の行に対して生成される値を参照します。 行が検索されるたびに、NEXT VALUE 式に対してシーケンス値が生成されます。

DRDA 環境においてブロッキングがクライアントで行われる場合、 アプリケーションの FETCH ステートメントの処理の前に、 Db2® サーバーでシーケンス値が生成される可能性があります。 クライアント・アプリケーションが、 データベースから検索されたすべての行を明示的に FETCH するのでない場合、そのアプリケーションは、 シーケンスの生成される値すべてを確認することはできません (FETCH されなかった行と同数分)。 それらの値はシーケンス内のギャップを構成することになります。

カーソルの SELECT ステートメント内の PREVIOUS VALUE 式への参照は、OPEN の際に評価されます。 言い換えると、カーソルの SELECT ステートメント内の PREVIOUS VALUE 式への参照は、 カーソルのオープンよりも前に、指定されたシーケンスに対してこのアプリケーション・プロセスにより生成された最後の値を参照するということです。OPEN の際にいったん評価されると、カーソルの本体の中で PREVIOUS VALUE によって戻される値は、FETCH ごとに変化することはありません。そのことは、カーソルの本体の中で NEXT VALUE が呼び出されても変りません。 カーソルが閉じられた後は、PREVIOUS VALUE の値は、 アプリケーション・プロセスにより生成された最後の NEXT VALUE になります。

代案の構文: キーワード NEXTVAL および PREVVAL を、 それぞれ NEXT VALUE および PREVIOUS VALUE の代わりに使用することができます。

  • 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
        INTO :HV_SEQ