miércoles, diciembre 24, 2008

¿Cómo recuperar el último índice (last_insert_id) introducido en Oracle usando iBatis?

Han sido varias las ocasiones en las que he utilizado iBatis como "aislante" de la base de datos. Lo considero una buena herramienta y procuro utilizarlo siempre que puedo aunque sólo sea para mantener las consultas a base de datos "limpias" y separadas del código.

Pues bien, hasta ahora sólo lo había utilizado con MySql. Pero en el proyecto en el que estoy lo estamos utilizando con Oracle.

Como buen aislante que es, no existen grandes diferencias de uso. Pero hoy me he encontrado con una. El motivo de este post.

iBatis tiene un "mecanismo" por el cual se nos permite recuperar el último id generado para la inserción de un registro. Esto, en MySql, se consigue de la siguiente manera:


<insert id="insert" parameterclass="producto">
<selectkey resultclass="java.lang.Integer" keyproperty="idProducto">
select last_insert_id() as value
</selectkey>
insert into Producto (idProducto, nombre)
values (#idProducto#, #nombre#)
</insert>

Pero cuando llegas a Oracle y su mundo_sin_autonuméricos tienes un problema. Debemos usar las secuencias. La solución es bastante fácil, por eso la encontré rápido :D Es esta:


<insert id="insert" parameterclass="producto">
<selectkey resultclass="java.lang.Integer" keyproperty="idProducto">
select s_prod.NEXTVAL as "idProducto" from dual
</selectkey>
insert into Customer (idProducto, nombre)
values (#idProducto#, #nombre#)
</insert>

Como podemos ver, la solución no difiere mucho de la presentada para MySql.

Espero que te ayude.

Por cierto, la información completa la puedes consultar en la Wiki de iBatis

1 comentario:

Angel Oliver dijo...

La verdad que creo hay un diferencia entre ambos.

Mysql con su last_insert_id() devuelve el ultimo valor insertado para la conexión.
Por lo que no tendremos problemas si otro cliente esta trabajando por la misma tabla.. y no necesitaremos de bloqueos, ni nada por el estilo.

Que no es lo mismo que pasa con s_prod.NEXTVAL