IDENTITY_VAL_LOCAL スカラー関数

IDENTITY_VAL_LOCAL 関数は、非 deterministic 関数であり、ID 列に割り当てられた最新の値を戻します。 この割り当ては、VALUES 節を使用した単一の INSERT ステートメントの結果として発生したものです。

Read syntax diagramSkip visual syntax diagramIDENTITY_VAL_LOCAL()

スキーマは SYSIBM です。

関数には入力パラメーターはありません。

対応する ID 列の実際のデータ・タイプに関係なく、結果は DECIMAL(31,0) です。

関数によって返される値は、最新の単一行挿入操作で識別されている表の ID 列に割り当てられた値です。 INSERT ステートメントには、ID 列の入った表の VALUES 節が入っていなければなりません。 また、INSERT ステートメントは、同じレベルで発行される必要もあります。つまり、値は、 次に割り当てられる値に置き換えられるまでは、割り当てられたレベルでローカルに使用できなければなりません。 (レベル、トリガーやルーチンが呼び出されるたびに新しく開始されます。)

割り当てられる値は (ID 列が GENERATED BY DEFAULT で定義される場合は) ユーザーによって 提供されるか、あるいはデータベース・マネージャーで生成された ID 値が提供されます。

SELECT FROM data-change-table-reference ステートメントを使用して、ID 列に割り当てられた値を入手することをお勧めします。 詳しくは、『副選択』の『table-reference』を参照してください。

VALUES 節をともなう単一行 INSERT ステートメントが、現行処理レベルで ID 列の入った表に対して発行されていない場合は、関数は NULL 値を戻します。

関数の結果が、以下の操作の影響を受けることはありません。
  • ID 列のない表の、VALUES 節をともなう単一行 INSERT ステートメント
  • VALUES 節をともなう複数行 INSERT ステートメント
  • fullselect を持つ INSERT ステートメント
  • ROLLBACK TO SAVEPOINT ステートメント

  • INSERT ステートメントの VALUES 節内の式は、挿入操作のターゲット列の 割り当ての前に評価されます。 そのため、INSERT ステートメントの VALUES 節にある IDENTITY_VAL_LOCAL 関数の呼び出しでは、 前の挿入操作からの ID 列として、最新の割り当て値が使用されます。 ID 列の入った表の VALUES 節をともなう単一行 INSERT ステートメントが、 IDENTITY_VAL_LOCAL 関数と同じレベル内で実行されていない場合、関数は NULL 値を戻します。
  • トリガーが定義されている表の ID 列の値は、ID 列のトリガー遷移変数を参照することにより、 トリガー内で判別できます。
  • 挿入トリガーのトリガー条件から IDENTITY_VAL_LOCAL 関数を呼び出した結果は、 NULL 値になります。
  • 複数の BEFORE または AFTER 挿入トリガーが 1 つの表について存在することが可能です。 この場合、各トリガーは別々に処理され、 IDENTITY_VAL_LOCAL 関数を使用して、 あるトリガー処置によって割り当てられている値を別のトリガー処置に使用することはできません。 概念上、複数のトリガー処置が同じレベルで定義されている場合でも、これは当てはまります。
  • 一般的に、BEFORE 挿入トリガーの本体に IDENTITY_VAL_LOCAL 関数を使用することはお勧めしません。 BEFORE 挿入トリガーのトリガー処置から IDENTITY_VAL_LOCAL 関数を呼び出した結果は、NULL 値になります。 トリガーが定義されている表の ID 列の値は、BEFORE 挿入トリガーのトリガー処置から IDENTITY_VAL_LOCAL 関数を呼び出すことによって得ることはできません。 ただし、ID 列のトリガー遷移変数を参照することにより、その ID 列の値をトリガー処置で得ることができます。
  • AFTER 挿入トリガーのトリガー処置から IDENTITY_VAL_LOCAL 関数を 呼び出した結果は、ID 列の入った表の VALUES 節をともなう、同じトリガー処置で 呼び出された最新の単一行挿入操作で識別されている表の ID 列に 割り当てられた値になります。 (これは、トリガーの挿入後、FOR EACH ROW と FOR EACH STATEMENT の両方に適用されます。) ID 列の入った表の VALUES 節をともなう単一行 INSERT ステートメントが、 IDENTITY_VAL_LOCAL 関数呼び出しの前に、同じトリガー処置の中で実行されなかった場合、 関数は NULL 値を返します。
  • IDENTITY_VAL_LOCAL 関数は deterministic 関数ではないため、カーソルの SELECT ステートメント内でのこの関数の呼び出しの結果は、各 FETCH ステートメントによって異なります。
  • 割り当て値は、ID 列に実際に割り当てられる値 (つまり、 その後に続く SELECT ステートメントで戻される値です)。 この値は必ずしも、INSERT ステートメントの VALUES 節で提供される値、あるいはデータベース・マネージャーによって生成される値とは限りません。 割り当て値は、 ID 列に関連するトリガー遷移変数の、トリガー挿入前の本体内の SET 遷移変数ステートメントに 指定されている値にすることができます。
  • IDENTITY_VAL_LOCAL の有効範囲: IDENTITY_VAL_LOCAL 値は、現行セッション内での ID 列が定義されている表への次の挿入までか、またはアプリケーション・セッションが終了するまで持続します。 この値は COMMIT または ROLLBACK ステートメントの影響を受けません。 直接 IDENTITY_VAL_LOCAL 値を設定することはできず、それは行を表に挿入した結果として得られます。

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

  • VALUES 節をともなう単一行 INSERT を ID 列と一緒に表に入れるのに 失敗した後の関数によって戻される値は予測不能です。 その値は、失敗した挿入操作の前に呼び出された関数から戻された値である場合もあれば、 あるいは、続く挿入操作に割り当てられる値の場合もあります。 戻される実際の値は、失敗のロケーションにより異なるので、予測不能です。

  • 例 1:例 1: T1 および T2 という 2 つの表を作成します。それぞれに C1 という名前の ID 列があります。 表 T2 の ID シーケンスを 10 から開始します。 C2 のいくつかの値を T1 に挿入します。
       CREATE TABLE T1
         (C1 INTEGER GENERATED ALWAYS AS IDENTITY,
          C2 INTEGER)
    
       CREATE TABLE T2
         (C1 DECIMAL(15,0) GENERATED BY DEFAULT AS IDENTITY (START WITH 10),
          C2 INTEGER)
    
       INSERT INTO T1 (C2) VALUES (5)
    
       INSERT INTO T1 (C2) VALUES (6)
    
       SELECT * FROM T1
    この照会は次の値を返します。
    C1          C2
    ----------- -----------
              1           5
              2           6
    単一行を表 T2 に挿入します。ここで、列 C2 は IDENTITY_VAL_LOCAL 関数から値を得ます。
       INSERT INTO T2 (C2) VALUES (IDENTITY_VAL_LOCAL())
    
       SELECT * FROM T2
    この照会は次の値を返します。
    C1                C2
    ----------------- -----------
                  10.           2
  • 例 2: トリガーに関係するネストされた環境では、ID 列がより低いレベルで割り当てられていても、 ある特定のレベルで割り当てられている ID 値を検索するには IDENTITY_VAL_LOCAL 関数を使用してください。 3 つの表 EMPLOYEE、 EMP_ACT、および ACCT_LOG があると仮定します。 EMP_ACT および ACCT_LOG 表に挿入をさらに行う AFTER 挿入トリガーが EMPLOYEE に定義されています。
       CREATE TABLE EMPLOYEE
         (EMPNO SMALLINT GENERATED ALWAYS AS IDENTITY (START WITH 1000),
          NAME CHAR(30),
          SALARY DECIMAL(5,2),
          DEPTNO SMALLINT)
    
       CREATE TABLE EMP_ACT
         (ACNT_NUM SMALLINT GENERATED ALWAYS AS IDENTITY (START WITH 1),
          EMPNO SMALLINT)
    
       CREATE TABLE ACCT_LOG
         (ID SMALLINT GENERATED ALWAYS AS IDENTITY (START WITH 100),
          ACNT_NUM SMALLINT,
          EMPNO SMALLINT)
    
       CREATE TRIGGER NEW_HIRE
         AFTER INSERT ON EMPLOYEE
         REFERENCING NEW AS NEW_EMP
         FOR EACH ROW
         BEGIN ATOMIC
           INSERT INTO EMP_ACT (EMPNO) VALUES (NEW_EMP.EMPNO);
           INSERT INTO ACCT_LOG (ACNT_NUM, EMPNO)
             VALUES (IDENTITY_VAL_LOCAL(), NEW_EMP.EMPNO);
         END
    最初にトリガーされる挿入操作は、行を EMP_ACT 表に挿入します。 このステートメントは、EMPLOYEE 表の EMPNO 列のトリガー遷移変数を使用して、EMPLOYEE 表の EMPNO 列の ID 値を EMP_ACT 表の EMPNO 列にコピーするよう指示します。 INSERT ステートメントはネストのこのレベルでは発行されていないので、EMPLOYEE 表の EMPNO 列に割り当てられている値を得るために、IDENTITY_VAL_LOCAL 関数を使用することはできません。 IDENTITY_VAL_LOCAL 関数が EMP_ACT 表の INSERT ステートメントの VALUES 節で呼び出された場合、NULL 値が返されます。 EMP_ACT 表に対する挿入操作の結果、ACNT_NUM 列の新しい ID 値も生成されます。

    2 番目にトリガーされる挿入操作は、行を ACCT_LOG 表に挿入します。 このステートメントは IDENTITY_VAL_LOCAL 関数を呼び出し、トリガー処置の 前の挿入操作で EMP_ACT 表の ACNT_NUM 列に割り当てられた ID 値を、ACCT_LOG 表の ACNT_NUM 列にコピーするよう指示します。 EMPNO 列は、EMPLOYEE 表の EMPNO 列と同じ値が割り当てられています。

    以下の INSERT ステートメントおよびすべてのトリガー・アクションが処理された後に:
       INSERT INTO EMPLOYEE (NAME, SALARY, DEPTNO)
         VALUES ('Rupert', 989.99, 50)
    3 つの表の内容は、以下のようになります。
       SELECT EMPNO, SUBSTR(NAME,1,10) AS NAME, SALARY, DEPTNO
         FROM EMPLOYEE
    
    EMPNO  NAME       SALARY  DEPTNO
    ------ ---------- ------- ------
      1000 Rupert      989.99     50
    
       SELECT ACNT_NUM, EMPNO
         FROM EMP_ACT
    
    ACNT_NUM EMPNO
    -------- ------
           1   1000
    
       SELECT * FROM ACCT_LOG
    
    ID     ACNT_NUM EMPNO
    ------ -------- ------
       100        1   1000
    IDENTITY_VAL_LOCAL 関数の結果は、 同じネスト・レベルで ID 列に割り当てられた最新の値になります。 オリジナル INSERT ステートメント、およびトリガー処置すべてが処理された後、 EMPLOYEE 表の EMPNO 列に割り当てられている値が 1000 であるため、 IDENTITY_VAL_LOCAL 関数は値 1000 を返します。