Página 1 de 1

DBD::ODBC last_insert_id

NotaPublicado: 2011-07-14 05:52 @286
por Lor
Agradecería sí pusiesen indicarme cómo otener el último id insertado en una tabla.

El motor de base de datos es SQL Server 2000 y estoy usando DBD::ODBC. En MySQL he usado el método last_insert_id pero aquí NO existe. ¿¿Cómo puedo obtenerlo??

¡¡¡Muchas gracias, por la ayuda!!! :D

Re: DBD::ODBC last_insert_id

NotaPublicado: 2011-07-14 07:06 @338
por explorer
Según la documentación del método last_insert_id() en el manual de DBI, con el MS SQL Server, sí que funciona, con tal de que en la última sentencia INSERT no se hayan utilizado placeholders, es decir, caracteres '?' que serán sustituidos por los valores que luego le pasamos en el execute().

Otra opción: sacarlo con esta sentencia: select @@identity

Re: DBD::ODBC last_insert_id

NotaPublicado: 2011-07-15 11:17 @512
por Lor
Muchas gracias, ¡¡¡este SQL Server es todo un tema!!!

last_insert_id() no funciona; lo probé de todas formas. Pero sí resultó select @@identity.

Una cosa para tener en cuenta para alguien que utilice este motor: no permite tener varios manejadores de sentencias activos por conexión. Hay que cerrarlas a todas, a medida que se utilizan ($sth->finish) . Hay que abrir varias conexiones a la base según cantidad de manejadores de sentencia se necesiten activos.

¡¡¡Muchas gracias!!!

Re: DBD::ODBC last_insert_id

NotaPublicado: 2012-03-15 09:08 @422
por dolisguilarte
Hola Lord,

¿Puedes por favor ayudarme con esto? Tengo exactamente el mismo problema que tu tuviste: no sé cómo sacar el id. Anexo mi código.

$sql = 'insert into nivel (descripcion, usuario, nivel_vigencia, id) SELECT descripcion, usuario,nivel_vigencia,id FROM nivel where id_nivel=20
SELECT @@identity';
$sth = $dbh->prepare($sql);
$sth->execute();
$id = $dbh->last_insert_id(undef, undef, 'Nivel', 'id_nivel');
$templ->registro($id);

El insert lo hace bien, pero la variable $id al imprimirla no me retorna ningún valor.
¿¿Qué modificación tengo que hacer para capturar el valor??

Mil Gracias...

Re: DBD::ODBC last_insert_id

NotaPublicado: 2012-03-15 10:04 @461
por explorer
Una de las limitaciones de select @@IDENTITY es que no funciona en la misma sentencia INSERT.

Deberás hacer un segundo prepare/execute para obtener el valor.

Re: DBD::ODBC last_insert_id

NotaPublicado: 2012-03-15 12:39 @569
por Lor
Exacto. Como dice explorer:

Primero hacer el INSERT
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   my $query1 = " INSERT INTO ........ " ;
  2.   my $sth1 = $dbh->prepare($query1) or die ("Error prepare: $query1" );
  3.   $sth1->execute()  or die ("Error prepare: $query1" );
  4.   $sth1->finish;
  5.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Luego
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.      my $query0 = ' SELECT  @@IDENTITY ';
  2.      my $sth0 = $dbh->prepare($query0) or die "Error al insertar con $query0";
  3.      $sth0->execute() or die "Error al insertar con $query0";
  4.      $id = $sth0->fetchrow_array();
  5.      $sth0->finish;
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: DBD::ODBC last_insert_id

NotaPublicado: 2012-03-15 13:02 @585
por dolisguilarte
Muchas gracias por la respuesta, ya resolví :)