Función escalar IDENTITY_VAL_LOCAL
La función IDENTITY_VAL_LOCAL devuelve el último valor asignado a una columna de identidad.
El esquema es SYSIBM.
La función IDENTITY_VAL_LOCAL no es determinista. 1 Aunque la función no tiene parámetros de entrada, los paréntesis vacíos deben especificarse cuando se invoque la función.
El resultado es DECIMAL(31,0), independientemente del tipo de datos real de la columna de identidad a la que corresponde el valor del resultado.
Una sentencia de modificación de datos que cumple los requisitos se refiere a una operación de inserción (especificada en una sentencia INSERT o en una sentencia MERGE).
El valor devuelto es el valor que se asignó a la columna de identidad de la tabla identificada en la declaración de cambio de datos calificados más reciente o en la operación de utilidad LOAD para una tabla con una columna de identidad. La operación de inserción debe emitirse en el mismo nivel; es decir, el valor debe estar disponible localmente dentro del nivel en el que se asignó hasta que sea reemplazado por el siguiente valor asignado. Se inicia un nuevo nivel cuando se invoca un desencadenante, una función o un procedimiento almacenado. Una condición desencadenante está al mismo nivel que la acción desencadenada asociada.
El valor asignado puede ser un valor suministrado por el usuario (si la columna de identidad se define como GENERATED BY DEFAULT) o un valor de identidad que fue generado por Db2.
El resultado puede ser nulo. El resultado es nulo en las siguientes situaciones:
- Cuando no se haya emitido una declaración de cambio de datos que cumpla los requisitos para una tabla que contenga una columna de identidad en el nivel de procesamiento actual
- Cuando se produjo un COMMIT o ROLLBACK de una unidad de trabajo desde la declaración de cambio de datos calificados más reciente que asignó un valor
El resultado de la función no se ve afectado por una instrucción ROLLBACK TO SAVEPOINT.
Notas
- Invocar la función dentro de una declaración de cambio de datos que cumpla los requisitos:
- Las expresiones de una declaración de cambio de datos que cumple los requisitos se evalúan antes de que se asignen valores a las columnas de destino de la declaración de cambio de datos que cumple los requisitos. Por lo tanto, cuando se invoca IDENTITY_VAL_LOCAL en una sentencia de modificación de datos que cumple los requisitos, el valor que se utiliza es el valor asignado más recientemente a una columna de identidad de una sentencia de modificación de datos anterior que cumple los requisitos. La función devuelve el valor nulo si no se ha ejecutado ninguna instrucción de modificación de datos que cumpla los requisitos dentro del mismo nivel que la invocación de la función IDENTITY_VAL_LOCAL. Cada declaración de cambio de datos que cumpla los requisitos y que implique una columna IDENTITY hace que el valor de identidad se copie en un almacenamiento específico de conexión en Db2. Por lo tanto, el valor de identidad más reciente se utiliza para una conexión, independientemente de lo que esté sucediendo con otras conexiones de usuario simultáneas.
- Invocar la función después de una operación de inserción fallida:
- La función devuelve un resultado impredecible cuando se invoca después de la ejecución fallida de una sentencia de modificación de datos que cumple los requisitos para una tabla con una columna de identidad. El valor podría ser el valor que habría sido devuelto por la función si se hubiera invocado antes de la sentencia de modificación de datos calificada fallida o el valor que se habría asignado si la sentencia de modificación de datos calificada hubiera tenido éxito. El valor real devuelto depende del punto de fallo y, por lo tanto, es impredecible.
- Invocar la función dentro de la instrucción SELECT de un cursor:
- Debido a que los resultados de la función IDENTITY_VAL_LOCAL no son deterministas, el resultado de una invocación de la función IDENTITY_VAL_LOCAL desde dentro de la sentencia SELECT de un cursor puede variar para cada sentencia FETCH.
- Invocar la función dentro de la condición de activación de un activador de inserción:
- El resultado de invocar la función IDENTITY_VAL_LOCAL desde la condición de un desencadenador de inserción es el valor nulo.
- Invocar la función dentro de una acción desencadenada de un desencadenador de inserción:
- Pueden existir múltiples activadores de inserción antes o después para una tabla. En tales casos, cada activador se procesa por separado, y los valores de identidad generados por las sentencias SQL emitidas dentro de una acción activada no están disponibles para otras acciones activadas que utilicen la función IDENTITY_VAL_LOCAL. Este es el caso aunque las múltiples acciones desencadenadas se definan conceptualmente al mismo nivel.
No utilice la función IDENTITY_VAL_LOCAL en la acción desencadenada de un disparador antes de la inserción. El resultado de la invocación de la función IDENTITY_VAL_LOCAL desde dentro de la acción activada de un activador de inserción anterior es el valor nulo.
El valor de la columna de identidad de la tabla para la que se ha definido el activador no se puede obtener invocando la función IDENTITY_VAL_LOCAL en la acción activada de un activador de inserción anterior. Sin embargo, el valor de la columna de identidad puede obtenerse en la acción activada, haciendo referencia a la variable de transición activador para la columna de identidad.
El resultado de invocar la función IDENTITY_VAL_LOCAL en la acción desencadenada de un desencadenador de inserción posterior es el valor asignado a una columna de identidad de la tabla identificada en la declaración de cambio de datos calificativa más reciente. Esa sentencia es la invocada en la misma acción desencadenada que tenía una sentencia de cambio de datos calificada para una tabla que contiene una columna de identidad. Si no se ejecutó una declaración de cambio de datos que cumpla los requisitos para una tabla que contenga una columna de identidad dentro de la misma acción desencadenada antes de invocar la función IDENTITY_VAL_LOCAL, la función devolverá un valor nulo.
- Invocar la función después de una operación de inserción con acciones desencadenadas:
- El resultado de invocar la función después de una inserción que activa desencadenadores es el valor realmente asignado a la columna de identidad (es decir, el valor que se devolvería en una instrucción SELECT posterior). Este valor no es necesariamente el valor proporcionado en la declaración de cambio de datos que califica o un valor generado por Db2. El valor asignado podría ser un valor que se especificó en una instrucción de variable de transición SET dentro de la acción desencadenada de un desencadenador antes de la inserción para una variable de transición de desencadenador asociada con la columna de identidad.
- Alcance de IDENTITY_VAL_LOCAL:
- El valor IDENTITY_VAL_LOCAL persiste hasta la siguiente inserción en la sesión actual en una tabla que tiene definida una columna de identidad, o hasta que finalice la sesión de la aplicación. El valor no se ve afectado por las sentencias COMMIT o ROLLBACK para aplicaciones locales. El valor de IDENTITY_VAL_LOCAL no se puede definir directamente y es el resultado de insertar una fila en una tabla. Las aplicaciones cliente o los productos de middleware que guardan el estado de una sesión y luego restauran el estado de una sesión para su posterior procesamiento no pueden restaurar el valor IDENTITY_VAL_LOCAL. En estas situaciones, la disponibilidad del valor IDENTITY_VAL_LOCAL solo debe tenerse en cuenta hasta el final de la transacción. Algunos ejemplos de situaciones en las que puede darse este tipo de situación son las aplicaciones que realizan las siguientes acciones:
- utilizar protocolos XA
- Utilizar agrupación de conexiones
- utilizar el concentrador de conexión
- uso del equilibrio de carga de trabajo de Sysplex
- conectarse a un servidor de z/OS® que utiliza DDF hilos inactivos
Cuando sea necesario preservar el valor asociado con IDENTITY_VAL_LOCAL a través de los límites de transacción para aplicaciones distribuidas, defina los cursores como WITH HOLD, o especifique la opción de enlace KEEPDYNAMIC(YES) para evitar que el subproceso del servidor se agrupe.
- Sintaxis alternativa:
- Utilice una sentencia SELECT FROM de modificación de datos para obtener el valor asignado a una columna de identidad. Para más información, consulte la referencia de la tabla de cambios de datos.
ejemplos
- Ejemplo 1:
- Establezca la variable IVAR en el valor asignado a la columna de identidad en la tabla EMPLOYEE. El valor devuelto por la función en la sentencia VALUES debe ser 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; - Ejemplo 2:
- Supongamos que dos tablas, T1 y T2, tienen una columna de identidad llamada C1. Db2 genera valores 1, 2, 3,... para la columna " C1 " en la tabla " T1 ", y valores 10, 11, 12,... para la columna " C1 " en la tabla " T2 ".
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;En este punto, la función IDENTITY_VAL_LOCAL devolvería un valor de 2 en IVAR. La siguiente instrucción INSERT inserta una sola fila en T2 donde la columna C2 obtiene un valor de 2 de la función IDENTITY_VAL_LOCAL
INSERT INTO T2 (C2) VALUES (IDENTITY_VAL_LOCAL()); SELECT * FROM T2 WHERE C1 = DECIMAL(IDENTITY_VAL_LOCAL(),15,0); C1 C2 ---------------------------------- ---------- 10 2Si se invoca la función IDENTITY_VAL_LOCAL después de esta inserción, se obtendría un valor de 10, que es el valor generado por Db2 para la columna C1 de T2. Supongamos que se inserta otra fila en T2. Para la siguiente sentencia INSERT, Db2 asigna un valor de 13 a la columna de identidad C1 y da a C2 un valor de 10 de IDENTITY_VAL_LOCAL. Por lo tanto, a C2 se le da el último valor de identidad que se insertó en T2.
INSERT INTO T2 (C2, C1) VALUES (IDENTITY_VAL_LOCAL(), 13); - Ejemplo 3:
- La función IDENTITY_VAL_LOCAL también puede invocarse en una instrucción INSERT que invoque la función IDENTITY_VAL_LOCAL y haga que se asigne un nuevo valor a una columna de identidad. El siguiente valor que se devuelve se establece cuando se invoca la función IDENTITY_VAL_LOCAL después de que se complete la instrucción INSERT. Por ejemplo, considere la siguiente definición de tabla:
CREATE TABLE T1 (C1 SMALLINT GENERATED BY DEFAULT AS IDENTITY, C2 SMALLINT);Para la siguiente sentencia INSERT, especifique un valor de 25 para la columna " C2 " (identidad), y " Db2 " genera un valor de 1 para " C1 " (identidad). Esto establece 1 como el valor que se devolverá en la próxima invocación de la función IDENTITY_VAL_LOCAL.
INSERT INTO T1 (C2) VALUES (25);En la siguiente sentencia INSERT, se invoca la función IDENTITY_VAL_LOCAL para proporcionar un valor para la columna " C2 ". Se asigna un valor de 1 (el valor de identidad asignado a la columna " C1 " de la primera fila) a la columna " C2 ", y " Db2 " genera un valor de 2 para " C1 ", la columna de identidad. Esto establece 2 como el valor que se devolverá en la próxima invocación de la función IDENTITY_VAL_LOCAL.
INSERT INTO T1 (C2) VALUES (IDENTITY_VAL_LOCAL());En la siguiente sentencia INSERT, se invoca de nuevo la función IDENTITY_VAL_LOCAL para proporcionar un valor para la columna " C2 ", y el usuario proporciona un valor de 11 para " C1 ", la columna de identidad. Se asigna un valor de 2 (el valor de identidad asignado a la columna " C1 " de la segunda fila) a la columna " C2 ". La asignación de 11 a C1 establece 11 como el valor que se devolverá en la próxima invocación de la función IDENTITY_VAL_LOCAL.
Después
r Se han procesado las 3 declaraciones INSERT, la tabla T1 contiene las siguientes acciones:INSERT INTO T1 (C2, C1) VALUES (IDENTITY_VAL_LOCAL(), 11);SELECT * FROM T1; C1 C2 ----------- ----------- 1 25 2 1 11 2El contenido de T1 ilustra que las expresiones en la cláusula VALUES se evalúan antes de las asignaciones para las columnas de la sentencia INSERT. Por lo tanto, una invocación de una función IDENTITY_VAL_LOCAL invocada desde una cláusula VALUES de una sentencia INSERT utiliza el valor asignado más recientemente para una columna de identidad en una sentencia INSERT anterior.
