• Publicidad

insert into a postgresql

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

insert into a postgresql

Notapor mariomb19 » 2012-05-14 10:03 @460

Buenas. Quiero insertar unos datos a una tabla. Encontré este código. ¿Qué significa "posthilit"?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $fastaEntry = $dbh -> prepare("<span class="posthilit">INSERT</span> <span class="posthilit">INTO</span> fasta  VALUES (?,?,?,?)");
  2.  
  3. my $sth1 = $dbh->prepare($query1) or die ("Error prepare: $query1" );
  4. $sth1->execute()  or die ("Error prepare: $query1" );
  5. $sth1->finish;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo tengo con este código pero no me funciona. Los datos están en las variables de los values.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $dbh = DBI->connect('DBI:Pg:dbname=hcm;host=xxx.xxx.xxx','xxx','xxxxxxx')|| die "ERROR CONEXIÓN : $DBI::errstr";

$sth = $dbh->prepare("INSERT INTO conversion.conv_compensa_sap_fi(nu_acreedor,nu_doc_sap,nu_factura,nu_doc_comp,tp_documento,fe_factura,fe_pago,mt_factura,mt_sin_imp,nu_siniestro) VALUES($campo1,$campo2,$campo3,$campo4,null,$campo5,$campo6,$campo7,$campo8,null)");
my($nu_acreedor,$nu_doc_sap,$nu_factura,$nu_doc_comp,$tp_documento,$fe_factura,$fe_pago,$mt_factura,$mt_sin_imp,$nu_siniestro);

$dbh->while(<>) {
my($nu_acreedor,$nu_doc_sap,$nu_factura,$nu_doc_comp,$tp_documento,$fe_factura,$fe_pago,$mt_factura,$mt_sin_imp,$nu_siniestro);
                                            $sth->execute($nu_acreedor,$nu_doc_sap,$nu_factura,$nu_doc_comp,$tp_documento,$fe_factura,$fe_pago,$mt_factura,$mt_sin_imp,$nu_siniestro);

$sth->finish;
print "hecho";
}
disconnect();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Publicidad

Re: insert into a postgresql

Notapor explorer » 2012-05-14 10:43 @488

Lo del "posthilit" no significa nada... es un trozo de código HTML que has copiado y pegado de la página resultado de una búsqueda que has hecho buscando por estos foros por la palabra INSERT. Es obvio que en una sentencia SQL no debería aparecer código HTML (salvo si forma parte de un valor a almacenar, claro).

En cuanto al segundo código, hay un follón tremendo...

Por una parte, tienes una sentencia INSERT que mete los valores de las variables $campo1, $campo2... (que además, no sabemos de dónde vienen) dentro de la llamada a un procedimiento interno asociado a 'conversion'.

Y luego, en la línea siguiente declaras unas variables ($nu_acreedor...). Naturalmente, los valores de esas variables serán indefinidos (undef).

Luego, ejecutas un $dbh->while(), que supongo que provocará el incendio del procesador, o al menos, la generación de un humo espeso...

Vuelves a declarar las mismas variables...

Y ahora llamas a execute(), con las variables. Esto, tiene el efecto de que cada variable se mete en el placeholder asociado en la consulta preparada con el prepare()... pero... 1) no existe ningún placeholder en esa consulta, y 2) las variables que pasas a la consulta están indefinidas, en parte porque las acabas de declarar (y dos veces, además). Ahora sí: ahora es cuando el ordenador estalla en pedazos.

Te recomiendo que te leas la sección 'Ejecutando' del Tutorial 'Cómo conectarte a tu database' de este mismo sitio web.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: insert into a postgresql

Notapor mariomb19 » 2012-05-14 15:35 @691

Muchas gracias, me salió bien. Estoy desarrollando otro script para insertar datos a una base de datos y en este me sale error. No sé por qué, si está igual al otro, que lo tengo bien.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use DBI;
  4. use DBD::Pg;
  5.  
  6. $dirname = "/home/rocco/dir2/";
  7.  
  8. opendir( DIR, $dirname ) || die "Error in opening dir $dirname\n";
  9.  
  10. #Seleccionando archivo de compensación
  11.  
  12. while ( my $rechazo = glob "/home/rocco/dir2/sapfi_rechazo_********_HCM_****.txt" ) {
  13.     open my $FH, '<', $rechazo or die "ERROR: No se pudo abrir [$rechazo]: $!\n";
  14.  
  15.     #Separando cada valor de los archivos y guardándolos en variables
  16.  
  17.     while ( my $reglon = readline $FH ) {
  18.         my @correa    = split /\|\s*/, $reglon;
  19.         my $espacio1  = "$correa[0]";
  20.         my $espacio2  = "$correa[1]";
  21.         my $espacio3  = "$correa[2]";
  22.         my $espacio4  = "$correa[3]";
  23.         my $espacio5  = "$correa[4]";
  24.         my $espacio6  = "$correa[5]";
  25.         my $espacio7  = "$correa[6]";
  26.         my $espacio8  = "$correa[7]";
  27.         my $espacio9  = "$correa[8]";
  28.         my $espacio10 = "$correa[9]";
  29.         my $espacio11 = "$correa[10]";
  30.         my $espacio12 = "$correa[11]";
  31.  
  32.         #Debido a que el primer campo se tiene que cargar la fecha actual de proceso
  33.         my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
  34.  
  35.         $year += 1900;
  36.         $mon++;
  37.  
  38.         my $fecha = "$mday/$mon/$year $hour:$min:$sec\n";
  39.  
  40.         #Abriendo conexión a la base de datos
  41.  
  42.         my $dbt = DBI->connect( 'DBI:Pg:dbname=hcm;host=xxx.xxx.xxx.xxx', 'xxx', 'xxxxxxx' )
  43.             || die "ERROR CONECCION : $DBI::errstr";
  44.  
  45.         #Aplicando el insert into
  46.  
  47.         $stl
  48.             = "insert into conversion.conv_rechazo_pago_vuelta(
  49.                   crpv_fecha_proc, crpv_error, crpv_cd_prov_acreed, crpv_nu_factura, crpv_fe_factura,
  50.                   crpv_mt_facturado, crpv_filial, crpv_tp_asiento, crpv_nu_control, crpv_tp_moneda
  51.            )
  52.               values(
  53.                    $fecha, $espacio12, $espacio11, $espacio9, $espacio3, null,
  54.                    $espacio2, $espacio4, $espacio10, $espacio6, null
  55.            )";
  56.  
  57.         #Ejecutando query
  58.  
  59.         $elevar = $dbt->prepare($stl);
  60.         $elevar->execute();
  61.         $elevar->finish;
  62.  
  63.         #Desconectándose de la base de datos
  64.  
  65.         $dbt->disconnect();
  66.  
  67.     }
  68.  
  69.     #desconectando del bucle
  70.  
  71.     close $FH;
  72. }
  73.  
  74. closedir(DIR);
  75.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Este es el error que me sale, no se por qué.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
DBD::Pg::st execute failed: execute called with an unbound placeholder at /home/rocco/Documentos/proyecto/ddd.pl
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Re: insert into a postgresql

Notapor explorer » 2012-05-14 16:34 @732

El error dice que no coincide el número de values (11) con el número de campos en el conv_rechazo_pago_vuelta (10).

Otra cosa... con Perl no necesitas escribir tanto. Me refiero a las líneas 19 a 30. Es mejor quitarlas y modificar estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $stl
  2.             = "insert into conversion.conv_rechazo_pago_vuelta(
  3.                  crpv_fecha_proc, crpv_error, crpv_cd_prov_acreed, crpv_nu_factura, crpv_fe_factura,
  4.                  crpv_mt_facturado, crpv_filial, crpv_tp_asiento, crpv_nu_control, crpv_tp_moneda
  5.           )
  6.              values(
  7.                   $fecha,
  8.                   $correa[11], $correa[10], $correa[8], $correa[2],
  9.                   null,
  10.                   $correa[1],  $correa[3],  $correa[9], $correa[5]
  11.           )";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: insert into a postgresql

Notapor mariomb19 » 2012-05-15 10:03 @460

Ok, voy a modificar esa líneas pero me sigue saliendo el mismo error. No sé por qué.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use DBI;
  4. use DBD::Pg;
  5.  
  6.  
  7. $dirname = "/home/rocco/dir2/";
  8.  
  9.            opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
  10.            
  11.                       #Seleccionando archivo de compensacion
  12.                      
  13.                       while (my $rechazo = glob "/home/rocco/dir2/sapfi_rechazo_********_HCM_****.txt") {
  14.                                  open my $FH, '<', $rechazo or die "ERROR: No se pudo abrir [$rechazo]: $!\n";
  15.                      
  16.                       #Separando cada valor de los archivos y guardandolos en variables
  17.                        
  18.                                  while (my $reglon = readline $FH) {            
  19.                                             my @correa = split /\|\s*/, $reglon;
  20.                                             my $espacio1= "$correa[0]";
  21.                                             my $espacio2= "$correa[1]";
  22.                                             my $espacio3= "$correa[2]";
  23.                                             my $espacio4= "$correa[3]";
  24.                                             my $espacio5= "$correa[4]";
  25.                                             my $espacio6= "$correa[5]";
  26.                                             my $espacio7= "$correa[6]";
  27.                                             my $espacio8= "$correa[7]";
  28.                                             my $espacio9= "$correa[8]";
  29.                                             my $espacio10= "$correa[9]";
  30.                                             my $espacio11= "$correa[10]";
  31.                                             my $espacio12= "$correa[11]";
  32.                                  
  33.                                  #Debido a que el primer campo se tiene que cargar la fecha actual de proceso
  34.                                  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  35.  
  36.                                             $year += 1900;
  37.                                             $mon++;
  38.                      
  39.                                             my $fecha= "$mday/$mon/$year $hour:$min:$sec\n";
  40.                                  
  41.                                  #Abriendo conexion a la base de datos
  42.                                  
  43.                                  my $dbt= DBI->connect('DBI:Pg:dbname=xxx;host=xxx.xxx.xxx.xxx','xxx','xxxxxxx')|| die "ERROR CONXION : $DBI::errstr";
  44.  
  45.                                  #Aplicando el insert into
  46.                                  
  47.                                             $stl ="insert into conversion.conv_rechazo_pago_vuelta(crpv_error,crpv_cd_prov_acreed,crpv_nu_factura,crpv_fe_factura,crpv_mt_facturado,crpv_filial,crpv_tp_asiento,crpv_nu_control,crpv_tp_moneda,crpv_fecha_proc)
  48.                                                       values ($espacio12,$espacio11,$espacio9,$espacio3,null,$espacio2,$espacio4,$espacio10,$espacio6,$fecha)";
  49.                                  
  50.                                  #Ejecutando query
  51.                                  
  52.                                             $elevar= $dbt->prepare($stl);                  
  53.                                             $elevar->execute();
  54.                                             $elevar->finish;
  55.  
  56.                                  #Desconectandose de la base de datos
  57.                                  
  58.                                  $dbt->disconnect();
  59.                              
  60.                              
  61.                       }
  62.      
  63.                       #desconectando del buqle
  64.                      
  65.                                  close $FH;
  66.                       }          
  67.                                  
  68.            closedir(DIR);
  69.            
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


error
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
DBD::Pg::st execute failed: execute called with an unbound placeholder at /home/rocco/Documentos/proyecto/ddd.pl line 53, <$FH> line 1.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Re: insert into a postgresql

Notapor explorer » 2012-05-15 16:01 @709

Yo estoy perdido... Quizás debas preguntar a un experto en PostgreSQL.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: insert into a postgresql

Notapor mariomb19 » 2012-05-16 08:18 @387

Gracias, amigo. Era un problema con un campo de la tabla pues estaba en integer y contenía letras. Gracias.
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444


Volver a Bases de datos

¿Quién está conectado?

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