Página 1 de 1

Actualizar tabla

NotaPublicado: 2013-04-02 15:14 @676
por clauss
Tengo el siguiente código, pero no logro que mis datos no se dupliquen me podrían ayudar con el UPDATE por favor
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. ##CONEXIÓN POSTGRES##################################
  4. use ConectarDB;
  5.  
  6. my ( $dbh, $sth, $dbh2, $sth2 );
  7. $dbh = ConectarDB->connect();
  8. ####INSTRUCCIÓN SQL PARA LA SELECCIÓN DE DATOS DE LAS TABLAS REQUERIDAS EN POSTGRES#####################
  9. $sql = "SELECT A.idtiposcobros_a,B.impuesto_b,A.caja_a,A.partida_a,A.atl_a,B.pcancl_b,
  10.                                 hcn.valor_anter_hcn,hcn.valor_nuevo_hcn,cc.descripcion_cc
  11.                                 FROM his_cobros_nuevo hcn
  12.                                 LEFT JOIN cobros_campos cc ON (hcn.idcampo_hcn=cc.idcampo_cc)
  13.                                 LEFT JOIN cobrosxcuenta A ON (hcn.atl_hcn = A.atl_a)
  14.                                 LEFT JOIN cobros B ON (B.atl_b = A.atl_a)";
  15.  
  16. my $sth = $dbh->prepare($sql) or die "Imposible preparar la requisición: " . $dbh->errstr;
  17. $sth->execute()
  18.     or die( "Couldn't execute statement: " . $sth->errstr );
  19.  
  20. {
  21.     while ( my @arrRTP = $sth->fetchrow_array() ) {
  22.         my $id   = $arrRTP[0];
  23.         my $nom  = $arrRTP[1];
  24.         my $ap1  = $arrRTP[2];
  25.         my $ap2  = $arrRTP[3];
  26.         my $pas1 = $arrRTP[4];
  27.         my $pas2 = $arrRTP[5];
  28.         my $pas3 = $arrRTP[6];
  29.         my $pas4 = $arrRTP[7];
  30.         my $pas5 = $arrRTP[8];
  31.         $wreg++;
  32.  
  33.         #*******************************************************************
  34. ##CONEXION ORACLE
  35.         use DBI;
  36.         use DBD::Oracle;
  37.         my $dbh2 = DBI->connect( "dbi:Oracle:host=127.0.0.1;port=1521;sid=orcl", admin, admin )
  38.             or die "Imposible conectar a la base ORACLE : " . DBI->errstr;
  39. ### MIGRACIÓN DE LOS DATOS A ORACLE&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  40.         my $sth2
  41.             = $dbh2->prepare(
  42.             "INSERT INTO pago_adepregral VALUES(@arrRTP[0],@arrRTP[1],@arrRTP[2],@arrRTP[3],@arrRTP[4],@arrRTP[5],@arrRTP[6])"
  43.             ) or die "Imposible preparar la requisición: " . $dbh2->errstr;
  44.         $sth2->execute();
  45.         $wgra++;
  46.     }
  47.     print "Los pagos han sido trasferidos al nuevo motor de Base de Datos Oracle\n"
  48. }
  49.  
  50. #***********************************************************************
  51. $sth->finish;
  52. $dbh->disconnect
  53.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Actualizar tabla

NotaPublicado: 2013-04-02 19:42 @862
por explorer
Bienvenido a los foros de Perl en Español, clauss.

Puedes usar la sentencia UPDATE en lugar de la INSERT, en la línea 39, si, además, agregas condiciones WHERE que indiquen a UPATE qué registro actualizar.

¿Algunos de los campos que hay en la base de datos son únicos (forman una clave única para ese registro)?

Re: Actualizar tabla

NotaPublicado: 2013-04-06 12:31 @563
por clauss
No sé cuál sea el orden o como realizarla ya que he intentado de varias maneras y me marca error tras error, quizás me falta algo. Te mando el como creo que es el más acercado, aclaro que todos mis datos son integer

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.    $sql2="UPDATE pago_adepregral SET cuenta=@arrRTP[0], periodo=@arrRTP[1],impuestoult=@arrRTP[2], sitfis=@arrRTP[3], sitpag=@arrRTP[4], impuesto_pagado=@arrRTP[5], descripcion=@arrRTP[6]"
  2. my $sth2 = $dbh2->prepare($sql2)or die "Imposible preparar la requisicion: " . $dbh2->errstr;
  3.           $sth2->execute();
  4.           $wgra++;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Actualizar tabla

NotaPublicado: 2013-04-06 12:43 @571
por explorer
Falta un ';' al final de la línea 1.

Sin saber los detalles de la base de datos, poco se puede hacer, salvo: antes de ingresar un registro, hacer un select para localizarlo. Si está, pues entonces no hace falta ingresarlo de nuevo, salvo que quieras actualizar algún campo. Si no está, pues se ingresa directamente.

Pero claro... todo esto es lo que hace update en una sola pasada.

Sería recomendable ver esos errores.

Re: Actualizar tabla

NotaPublicado: 2013-04-06 12:53 @578
por clauss
todos los datos son enteros, y pues si quiero de preferencia que actualize, ya que cada vez que corra el script me va a hacer duplicacion de datos y es lo que no quiero, este es el error que me aparece
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. ^CDBD::Oracle::st execute failed: ORA-01013: user requested cancel of current operation (DBD ERROR: error possibly near <*> indicator at char 7 in 'UPDATE <*>pago_adepregral SET cuenta=443995,periodo=179995,impuestoult=110995,sitfis=220995,sitpag=9995,impuesto_pagado=799995,descripcion=995') [for Statement "UPDATE pago_adepregral SET cuenta=443995,periodo=179995,impuestoult=110995,sitfis=220995,sitpag=9995,impuesto_pagado=799995,descripcion=995"] at ./prueba20.pl line 42.
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Actualizar tabla

NotaPublicado: 2013-04-06 13:40 @611
por explorer
Para evitar la duplicación de datos, o borras toda la base de datos antes, o usas clausulas WHERE junto con el UPDATE.

He buscado el mensaje de error en Internet, y algunos han encontrado la solución cerrando el programa sqlplus que tenían abierto en otra ventana.

Otros dicen que ese mensaje sale por culpa de un timeout o el usuario hizo un Control-C para parar el proceso.

Lo que sí he visto y no me gusta nada, es que tienes metido el prepare() dentro del bucle while(). Para hacerlo bien, solo es necesario hacerlo una vez, fuera del bucle. Dentro del bucle, con el execute(), ya es suficiente para pasar los argumentos variables a la sentencia, por medio de los contenedores definidos en el prepare().