Foros del Web » Programación para mayores de 30 ;) » Programación General »

Insertando multiples registros con MySQL

Estas en el tema de Insertando multiples registros con MySQL en el foro de Programación General en Foros del Web. Hola a todos, tengo un problema insertando muchos registros en una base de datos de MySQL, lo extraño es que de un total de 3200 ...
  #1 (permalink)  
Antiguo 16/08/2007, 11:12
Avatar de Saga  
Fecha de Ingreso: febrero-2002
Ubicación: Monterrey
Mensajes: 32
Antigüedad: 20 años, 3 meses
Puntos: 0
Insertando multiples registros con MySQL

Hola a todos, tengo un problema insertando muchos registros en una base de datos de MySQL, lo extraño es que de un total de 3200 registros solo se graban 184.

Les anexo el código simplificado: @data_ contiene los 3200 registros, los cuales si son desplegados en pantalla, los datos antes de ser insertados en la tabla son validados y no se generan errores de tipo de datos o longitud.

Esta estructura de código lo he utilizado varios años y nunca había tenido problemas manipulado una menor cantidad de datos, ¿existe alguna sintaxis diferente cuando se trata de volúmenes de datos mayores?

espero me puedan ayudar
Saludos




Código:
	
$dbh = ConectarDB->connect();
foreach $i (@data_) {
        ($id1_, $id2_, $id3_, $id4_, $id5_, $id6_, $id7_) = split(/,/,$i);
	 ($departamento, $categoria) = split(/\./,$id7_);
         print "($id7_) $id1_|$departamento|$categoria|$id3_|$id2_|$id5_|$id4_|$id6_<br>\n";

	 $sth = $dbh->prepare('INSERT INTO inventarios values(?,?,?,?,?,?,?,?)') or die("Couldn't prepare statement: " . $dbh->errstr);
         $sth->execute($id1_,$departamento,$categoria,$id3_,$id2_,$id5_,$id4_,$id6_) or die("Couldn't execute statement: " . $sth->errstr);
}
$sth->finish;
$dbh->disconnect;
  #2 (permalink)  
Antiguo 16/08/2007, 12:02
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 20 años, 3 meses
Puntos: 90
Re: Insertando multiples registros con MySQL

hay un grabe error en el código, estás dejando las sth abiertas

debería de ser así...

Código:
my $dbh = ConectarDB->connect();
foreach my $i (@data_) {
        my ($id1_, $id2_, $id3_, $id4_, $id5_, $id6_, $id7_) = split(/,/,$i);
	 ($departamento, $categoria) = split(/\./,$id7_);
         print "($id7_) $id1_|$departamento|$categoria|$id3_|$id2_|$id5_|$id4_|$id6_<br>\n";

	 my $sth = $dbh->prepare('INSERT INTO inventarios values(?,?,?,?,?,?,?,?)') or die("Couldn't prepare statement: " . $dbh->errstr);
         $sth->execute($id1_,$departamento,$categoria,$id3_,$id2_,$id5_,$id4_,$id6_) or die("Couldn't execute statement: " . $sth->errstr);
         $sth->finish;
}

$dbh->disconnect;
Fijate que el finish de sth está dnetro del bucle ahora, y que las variables fueron bien definidas con my, eso optimiza mucho el uso de la memoria...Siempre es recomendable usar el use strict para acostumbrarnos a programar correctamente...

Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 16/08/2007, 12:43
Avatar de Saga  
Fecha de Ingreso: febrero-2002
Ubicación: Monterrey
Mensajes: 32
Antigüedad: 20 años, 3 meses
Puntos: 0
Re: Insertando multiples registros con MySQL

Muchas gracias Monoswin, tienes toda la razón el problema estaba en el $sth->finish; por eso me acababa la memoria. Por cierto jeje si estaba declarando las variables solo que postee un fragmento del código.

Gracias por la ayuda
  #4 (permalink)  
Antiguo 16/08/2007, 13:13
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 522
Antigüedad: 16 años
Puntos: 11
Re: Insertando multiples registros con MySQL

Es que lo correcto es sacar el prepare fuera del bucle, ya que siempre es la misma "preparación", y hacer un execute en cada vuelta. El finish() sobra la mayoría de las veces (esto último lo dice el manual, no yo).
Código Perl:
Ver original
  1. my $dbh = ConectarDB->connect();
  2. my $sth = $dbh->prepare('INSERT INTO inventarios values(?,?,?,?,?,?,?,?)')
  3.     or die("Couldn't prepare statement: " . $dbh->errstr);
  4. my @id;
  5. my ($departamento, $categoria);
  6. my @vars;
  7. foreach ( @data_ ) {
  8.     @id = split q{,}, $_;
  9.     ($departamento, $categoria) = split q{.}, $id[6];
  10.     @vars = ($id[0], $departamento, $categoria, @id[2,1,4,3,5]);
  11.     print "($id[6]) ", join(q{|}, @vars), "<br>\n";
  12.     $sth->execute(@vars) or die("Couldn't execute statement: " . $sth->errstr);
  13. }
  14. $dbh->disconnect;

Última edición por jferrero; 04/03/2010 a las 17:27
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:46.