• Publicidad

Obtener el valor de un campo autoincremental desde Perl

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Obtener el valor de un campo autoincremental desde Perl

Notapor hugo11ab » 2010-12-31 09:19 @430

¿Qué tal? Antes que nada les deseo un feliz año nuevo y que todos sus propósitos se cumplan, pero sobre todo que haya mucha salud.

El problema que tengo es el siguiente: ¿hay alguna manera de obtener el valor de un campo autoincremental desde Perl? Estoy haciendo un script en Perl donde inserto un registro en una tabla de Perl llamada programas, la cual tiene un campo tipo aautoincremental llamado "id". Cada vez que inserto un programa el campo id se incrementa automáticamente, entonces quiero saber cómo puedo saber el valor de id.

Buscando en la web encontré que se regresa con RETURNING id, pero no sé cómo obtener ese valor desde Perl. Este es el script en el cual estoy tratando de recuperar ese valor.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. BEGIN
  4. {
  5.     # Declaramos la ruta de ubicacion del modulo 'comun'.
  6.      @INC=(@INC,"/var/www/cgi-bin/comun");
  7. }
  8. use principal_html;
  9. use strict;
  10.  
  11. &insertar_programa()
  12. exit;
  13.  
  14. sub inserta_programa {
  15.  
  16.  my $sql="INSERT INTO programas (nombre_programa,tipo_programa,status_programa) VALUES ('$FORM{nombre}','$FORM{tipo}',$FORM{status}) RETURNING  id";
  17.  
  18.  my $id=&ejecuta($FORM{db},$sql);
  19.  
  20.  return $id;
  21. }
  22.  
  23. sub ejecuta  {
  24.  my ($dbh,$sth,$resultado);
  25.  my ($db,$sql) = @_;
  26.  
  27.  $dbh=DBI->connect("dbi:Pg:dbname=$db; host=$ipserver; port=5432","postgres","TsyaR$_54") or die \
  28.  "Imposible conectar a la base de datos: $DBI::errstr";
  29.  if(!$DBI::errstr){
  30.   $sth = $dbh->prepare($sql) or die "No se ha preparado: $DBI::errstr";
  31.   $resultado=$sth->execute or die "No es posible la ejecucion $sql $DBI::errstr";
  32.   $sth->finish;
  33.   $dbh->disconnect;
  34.   return $resultado;
  35.  } else { &mensaje("Error !!!!","Base de Datos Inexistente"); exit; }
  36. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El insert lo hace correctamente, pero cuando regreso la variable "$resultado" siempre me regresa el valor de uno. Espero y puedan ayudarme a obtener el valor del campo autoincremental.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Publicidad

Re: Obtener el valor de un campo autoincremental desde Perl

Notapor explorer » 2010-12-31 10:03 @460

Depende del controlador de base de datos que estés usando (veo que es PostgreSQL), pero lo normal sería usar la función last_insert_id(). Dice el manual de DBI:
$rv = $dbh->last_insert_id($catalog, $schema, $table, $field);

Devuelve un valor 'identificando' la fila recien insertada, si es posible. Normalmente este será un valor asignado por el servidor de la base de datos a una columna de tipo serie o autoincremental. Devuelve undef si el controlador no soporta el método o si no puede determinar el valor.
Returns a value 'identifying' the row just inserted, if possible. Typically this would

Los parámetros de $catalog, $schema, $table, y $field pueden ser requeridos por algunos controladores (ver abajo).

Si no sabes los valores de los parámetros y tu controlador no los necesita, entonces usa "undef" por cada uno.

A continuación vienen una serie de problemas o peculiaridades, según el controlador. Habla de MySQL, MS SQL, Sybase, etc. De PostgreSQL no dice nada. Yo probaría con valores "undef".

Este método fue introducido en DBI v1.38.

El valor '1' que obtienes desde el execute() es, según dice el manual, una indicación de que se ha afectado a 1 línea, al tratarse de una sentencia no-SELECT.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener el valor de un campo autoincremental desde Perl

Notapor hugo11ab » 2011-01-03 12:12 @550

Gracias Explorer, como siempre tus respuestas son muy atinadas. Ya hice la prueba y pude obtener el valor del id.

Coloqué los 4 parámetros como undef y no funcionó, así que solo puse el nombre de la tabla y el campo y con eso me regresó el id que se estaba ingresando.

De esta manera quedó la instrucción:

$resultado = $dbh->last_insert_id(undef, undef, $table, $field);
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados