• Publicidad

Actualizar tabla

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

Actualizar tabla

Notapor clauss » 2013-04-02 15:14 @676

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.004 segundos, usando GeSHi 1.0.8.4
clauss
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-04-02 15:07 @671

Publicidad

Re: Actualizar tabla

Notapor explorer » 2013-04-02 19:42 @862

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)?
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: Actualizar tabla

Notapor clauss » 2013-04-06 12:31 @563

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
Última edición por clauss el 2013-04-06 12:49 @576, editado 1 vez en total
clauss
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-04-02 15:07 @671

Re: Actualizar tabla

Notapor explorer » 2013-04-06 12:43 @571

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.
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: Actualizar tabla

Notapor clauss » 2013-04-06 12:53 @578

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.003 segundos, usando GeSHi 1.0.8.4
clauss
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-04-02 15:07 @671

Re: Actualizar tabla

Notapor explorer » 2013-04-06 13:40 @611

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().
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


Volver a Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado