Pregunta

¿Cuál es la forma más eficiente de obtener el valor de la columna SERIAL después de la instrucción INSERT? Es decir. Estoy buscando una manera de replicar la funcionalidad @@ IDENTITY o SCOPE_IDENTITY de MS SQL

¿Fue útil?

Solución

El valor de la última inserción de SERIE se almacena en el registro SQLCA, como la segunda entrada en la matriz sqlerrd. La respuesta de Brian es correcta para ESQL / C, pero no ha mencionado el idioma que está utilizando.

Si está escribiendo un procedimiento almacenado, el valor se puede encontrar de la siguiente manera:

LET new_id = DBINFO('sqlca.sqlerrd1');

También se puede encontrar en $ sth- > {ix_sqlerrd} [1] si usa DBI

Existen variantes para otros idiomas / interfaces, pero estoy seguro de que obtendrás la idea.

Otros consejos

He visto esto usado.

if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
  Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
  Result := -(Abs(LOCAL_SQLCA^.sqlcode));

No creo que " eficiente " es la palabra que estás buscando aquí. Es más una cuestión de exactitud. No estoy seguro de poder explicarlo mejor que los Libros en pantalla de SQL, pero en general, a menos que realmente sepa lo que está haciendo y tenga una razón específica para usar @@ IDENTITY, use SCOPE_IDENTITY. La razón más obvia para esto es que @@ IDENTITY no devolverá la identidad del último registro agregado por su programa / sp / etc si hay un activador adjunto a la tabla. Además, podría haber problemas en aplicaciones de alto volumen en las que se produzcan dos transacciones al mismo tiempo y ocurra lo siguiente ...

  1. Su inserción
  2. inserción de otro usuario
  3. Devolverle la identidad de otro usuario

El OP no especificó qué versión de Informix se está utilizando, por lo que puede haber diferentes respuestas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top