IDENTITY_VAL_LOCAL
IDENTITY_VAL_LOCAL は、識別列に割り当てられた最も新しい値を戻す 非決定性関数です。
この関数には入力パラメーターはありません。 結果値に対する識別列の実際のデータ・タイプに関係なく、結果は DECIMAL(31,0) です。
戻される値は、最も新しい挿入操作 (INSERT ステートメントまたは MERGE ステートメントのいずれかで指定 されたもの) で指定された表の識別列に割り当てられた値です。挿入操作は同じレベルで実行しなければなりません。つまり、値は、次の割り当て値によって置き換えられるまで、その値が割り当てられたレベル内でローカルに使用可能でなければなりません。新しいレベルが開始されるのは、トリガー、関数、または ストアード・プロシージャーが呼び出されたときです。 トリガー状態は、それに関連してトリガーされるアクションと同じ レベルにあります。
割り当てられる値には、ユーザーが指定する値 (識別列 が GENERATED BY DEFAULT と定義されている場合) と、データベース・マネージャーが生成する識別値があります。
結果が、NULL になることもあります。結果がヌルになるのは、現行の処理 レベルにある識別列を含まない表に対して、挿入操作を発行し た場合です。 これには、前挿入トリガーまたは後挿入トリガーの中でこの関数を呼び出し た場合も含まれます。
以下のステートメントは、IDENTITY_VAL_LOCAL 関数の結果に影響を与えません。
- 識別列を含まない表に対する挿入操作
- UPDATE ステートメント
- COMMIT ステートメント
- ROLLBACK ステートメント
注
以下の注意事項では、幾つかの異なる状況下でこの関数を呼び出した 場合の、この関数の動作を説明します。
- 挿入操作の VALUES 文節の中でこの関数を呼び出した場合
- 挿入操作のターゲット列に値が割り当てられる 前に、挿入操作の中の式が評価されます。 したがって、挿入操作の中で IDENTITY_VAL_LOCAL を呼び出し た場合は、使用される値は、前回の挿入操作以降に識別列に 割り当てられた最も新しい値です。 以前に、この IDENTITY_VAL_LOCAL 関数の呼び出しと同じレベル で挿入操作が実行されていない場合は、この関数は NULL 値を戻します。
- 挿入操作が失敗した後でこの関数を呼び出した場合
- 識別列を含む表に対する挿入操作の実行が失敗した後 でこの関数を呼び出した場合は、どのような結果が戻されるかは予測できません。 戻される値は、失敗した挿入操作の前にこの関数が呼び出されていたと すれば、そのときに戻されているものと予想される値になることもあり、また、挿入操作が成功していたとすれば戻されていたであろうと予想される 値になることもあります。 実際に戻される値は障害の発生時点によって決まるため、予測すること はできません。
- カーソルの SELECT ステートメントの中でこの関数を呼び出した場合
- IDENTITY_VAL_LOCAL 関数の結果は非決定性のものなので、カーソルの SELECT ステートメントの中で IDENTITY_VAL_LOCAL 関数を 呼び出した場合の結果は、各 FETCH ステートメントごとに異なる場合があります。
- プロシージャーまたは関数のデフォルト式の中でこの関数を呼び出した場合
- プロシージャーまたは関数のデフォルト式の中から IDENTITY_VAL_LOCAL 関数を 呼び出した結果は定義されていません。この関数をデフォルト式の中で使用するべきではありません。
- 挿入トリガーのトリガー条件の中でこの関数を呼び出した場合
- 挿入トリガーの条件の中で IDENTITY_VAL_LOCAL 関数を呼び出した 場合の結果は、NULL 値になります。
- 挿入トリガーによりトリガーされたアクションの中でこの関数を呼び出した場合
- 1 つの表について、複数の前挿入トリガーおよび後挿入トリガー
が存在することができます。
その場合は、各トリガーはそれぞれ個別に処理され、トリガーされた
アクションの中で発行された SQL ステートメントが生成する識別値は、IDENTITY_VAL_LOCAL 関数を使用する他のトリガーされたアクションでは使用
できません。
これは、トリガーされる複数のアクションが概念的に同じレベルで
定義されている場合も同じです。
前挿入トリガーのトリガーされたアクションの中では、IDENTITY_VAL_LOCAL 関数を使用しないでください。 前挿入トリガーのトリガーされたアクションの 中で IDENTITY_VAL_LOCAL 関数を呼び出した場合の結果は、NULL 値になります。 トリガーが定義されている表の識別列の値を、前挿入トリガーのトリガー されたアクションの中で IDENTITY_VAL_LOCAL を呼び出すことによって 取得することはできません。 ただし、トリガーされたアクションで識別列に対するトリガー遷移変数を 参照することにより、この識別列の値を取得することができます。
後挿入トリガーのトリガーされたアクションの 中で IDENTITY_VAL_LOCAL 関数を呼び出した場合の結果は、識別列を 含む表に対する同じトリガーされたアクションの中で呼び出された 最新の挿入操作で指定されている表の識別列に割り当てられ ている値になります。 IDENTITY_VAL_LOCAL 関数を呼び出す前に、同じトリガーされたアクション の中で、識別列を含む表に対する挿入操作が実行されていない 場合は、この関数は NULL 値を戻します。
- トリガーされたアクションを伴う挿入操作の後でこの関数を呼び出した場合
- トリガーを活動化する挿入操作の後で関数を呼び出した場合の結 果は、実際に識別列に割り当てられている値 (つまり、以後の SELECT ステートメントで戻されることになる値) になります。 この値は、必ずしも、挿入操作で提供される値、またはデータベース・マネージャーが生成する値とは限りません。 割り当てられる値は、識別列に関連したトリガー遷移変数に対する 前挿入トリガーのトリガーされたアクションの中で、SET 遷移変数 ステートメントに指定されている値の場合もあります。
- IDENTITY_VAL_LOCAL の有効範囲
- IDENTITY_VAL_LOCAL 値は、現行セッションにおいて、定義されている ID 列が含まれる表に対して次の挿入操作が行われるか、アプリケーション・セッションが終了するまで存続します。この値は COMMIT または ROLLBACK ステートメントの影響を受けません。直接 IDENTITY_VAL_LOCAL 値を設定することはできず、それは行を表に挿入した結果として得られます。
特にパフォーマンスの目的で広く使用されている技法として、アプリケーションまたは製品に接続のセットを管理させ、トランザクションを任意の接続へ経路指定する、というものがあります。こうした状況では、IDENTITY_VAL_LOCAL 値はそのトランザクションが終了するまでの間のみ有効です。
- IDENTITY_VAL_LOCAL の代替方法:
- ID 列に割り当てられた値を取得するには、SELECT FROM INSERT を使用することをお勧めします。 詳しくは、table-referenceを参照してください。
例
- 変数 IVAR を、EMPLOYEE 表の識別列に割り当てられている値に
セットします。
VALUES INTO ステートメントの中でこの関数から戻される値は 1 です。
CREATE TABLE EMPLOYEE (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY, NAME CHAR(30), SALARY DECIMAL(5,2), DEPTNO SMALLINT) INSERT INTO EMPLOYEE (NAME, SALARY, DEPTNO) VALUES('Rupert', 989.99, 50) VALUES IDENTITY_VAL_LOCAL() INTO :IVAR
- T1 および T2 という 2 つの表に、C1 という名前の識別列があるとします。
データベース・マネージャーは、表 T1 の C1 列については 値 1、2、3 ... を生成し、表 T2 の C1 列については 値 10、11、12 ... を生成します。
CREATE TABLE T1 (C1 SMALLINT GENERATED ALWAYS AS IDENTITY, C2 SMALLINT) CREATE TABLE T2 (C1 DECIMAL(15,0) GENERATED BY DEFAULT AS IDENTITY ( START WITH 10 ) , C2 SMALLINT) INSERT INTO T1 ( C2 ) VALUES(5) INSERT INTO T1 ( C2 ) VALUES(5) SELECT * FROM T1
C1 C2 1 5 2 5 VALUES IDENTITY_VAL_LOCAL() INTO :IVAR
この時点で、IDENTITY_VAL_LOCAL 関数は IVAR に値 2 を戻します。 以下の INSERT ステートメントは、T2 に 1 つの行を挿入し、その行の 列 C2 には、IDENTITY_VAL_LOCAL 関数が戻す 2 の値が入ります。
INSERT INTO T2 ( C2 ) VALUES( IDENTITY_VAL_LOCAL() ) SELECT * FROM T2 WHERE C1 = DECIMAL( IDENTITY_VAL_LOCAL(), 15, 0)
C1 C2 10 2 この INSERT の後で IDENTITY_VAL_LOCAL 関数を呼び出すと、値 10 が 戻されます。これは、データベース・マネージャーが T2 の列 C1 用として生成した値です。 ここで、T2 にもう 1 つ行を挿入するものとします。 以下の INSERT ステートメントでは、データベース・マネージャーは、列 C1 を識別するために値 13 を割り当て、 C2 には IDENTITY_VAL_LOCAL から戻された 値 10 を割り当てます。 したがって、C2 には、T2 に挿入された最後の識別値が与えられます。
INSERT INTO T2 ( C2, C1 ) VALUES( IDENTITY_VAL_LOCAL(), 13 ) SELECT * FROM T2 WHERE C1 = DECIMAL( IDENTITY_VAL_LOCAL(), 15, 0)
C1 C2 13 10 - IDENTITY_VAL_LOCAL 関数を呼び出すと同時に、識別列に新しい値を
割り当てる INSERT ステートメントの中で、IDENTITY_VAL_LOCAL 関数を呼び出すこともできます。
この場合、次に戻される値は、INSERT ステートメントの完了後
に IDENTITY_VAL_LOCAL 関数が呼び出された時点で決定されます。
例えば、以下の表定義について考えてみてください。
CREATE TABLE T3 (C1 SMALLINT GENERATED BY DEFAULT AS IDENTITY, C2 SMALLINT)
以下の INSERT ステートメントでは、C2 列用の値として 25 を指定して おり、データベース・マネージャーは、C1 (識別列) 用の値として 1 を生成します。 その結果、次回の IDENTITY_VAL_LOCAL 関数の呼び出しで戻される値と して、1 が設定されます。
INSERT INTO T3 ( C2 ) VALUES( 25 )
以下の INSERT ステートメントでは、IDENTITY_VAL_LOCAL 関数が呼び出され て、C2 列に入れる値を戻します。 値 1 (最初の行の C1 列に割り当てられている識別値) が C2 列に割り当て られ、データベース・マネージャーは C1 (識別列) の値として 2 を生成します。 その結果、次回の IDENTITY_VAL_LOCAL 関数の呼び出しで戻される値と して、2 が設定されます。
INSERT INTO T3 ( C2 ) VALUES( IDENTITY_VAL_LOCAL() )
以下の INSERT ステートメントでは、再び IDENTITY_VAL_LOCAL 関数が 呼び出されて C2 列に入れる値を戻し、ユーザーが C1 (識別列) 用の値とし て 11 を指定します。 値 2 (2 番目の行の C1 列に割り当てられている識別値) が、C2 列に 割り当てられます。 C1 には 11 が割り当てられ、次回の IDENTITY_VAL_LOCAL 関数の 呼び出しでは 11 の値が戻されます。
INSERT INTO T3 ( C2, C1 ) VALUES( IDENTITY_VAL_LOCAL(), 11 )
上記の 3 つの INSERT ステートメントの処理が終わると、表 T3 には以下の 値が含まれています。
C1 C2 1 25 2 1 11 2 T3 の内容は、INSERT ステートメントの列の値が割り当てられる 前に、VALUES 文節の中の式が評価されることを示しています。 したがって、INSERT ステートメントの VALUES 文節から IDENTITY_VAL_LOCAL 関数を 呼び出すと、前の INSERT ステートメントで識別列に割り当てられている 最も新しい値が使用されます。