• Publicidad

Cómo manejar errores en 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.

Cómo manejar errores en Perl

Notapor rookie » 2006-05-26 10:24 @475

Saludos a todos.
Tengo problemas con el manejo de errores que se generan al insertar datos en una tabla.
Tengo una tabla "a" que contiene datos no normalizados, es decir, tiene datos repetidos. Y quiero pasar los datos a una tabla "b" que contiene las llaves necesarias para poder rechazar los datos de la tabla a que esten repetidos. Pero los datos que no pudieron ser insertados en la tabla "b" por estar repetidos, deseo colocarlos en una tabla "c" para poder saber cuales eran los datos que estaban repetidos.
La pregunta es:
Al mandar un código de error en la sentencia
Código: Seleccionar todo
$dbh->do("INSERT INTO a VALUES( $tupla[1], $tupla[2]);") or warn("Error en al INSERTAR en a: $dbh->errstr\n");
¿cómo puedo manejar ese código para hacer un segundo INSERT para la tabla "b" cuando el primer INSERT haya fallado?

Espero que me puedan ayudar... gracias por sus respuestas.
Hasta pronto.
rookie
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2006-03-01 18:48 @825

Publicidad

Notapor explorer » 2006-05-26 10:38 @484

Respuesta rápida no probada:
Código: Seleccionar todo
unless ( $dbh->do("INSERT INTO a VALUES( $tupla[1], $tupla[2]);") ) {
    $dbh->do("INSERT INTO c VALUES( $tupla[1], $tupla[2]);")
        or warn "Error al INSERTAR en c: $dbh->errstr\n";
}
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

Notapor rookie » 2006-05-26 14:57 @664

Saludos explorer..

Creo que ya soy uno de tus clientes. Efectivamente con la claúsula unless ejecuto la primera sentencia y en caso de fallo se ejecuta la segunda. Algo que al parecer también puede hacerse con if, aunque yo estaba lidiando con los "errstr" pero al parecer es un poco más lioso.
Con esto he logrado que los datos rechazados en el primer INSERT, se coloquen en otra tabla.

Pregunta:
¿Si tengo en la tabla "a" 2 llaves distintas, es posible colocar en una tabla "error" un entero que me indique cual llave provocó el rechazo de los datos? ¿Si era la llave 1 o la llave 2 o incluso una llave 3?

¡Gracias!
rookie
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2006-03-01 18:48 @825

Notapor explorer » 2006-05-27 02:45 @156

No lo acabo de entender...

En el código, estamos guardando en "c" las claves que no hemos podido insertar en "a". Se supone que era debido a que ya existían.

En el caso de que se encuentre una tercera clave idéntica, fallará el INSERT de la tabla "c".

Si lo que quieres es saber cuántas claves repetidas hay, cambia el INSERT de la tabla "c" por un UPDATE y agregar un tercer campo que sea autoincrementable, para llevar la cuenta de las veces que vamos insertando la misma clave.
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

Notapor rookie » 2006-05-29 15:57 @706

Saludos Explorer...!

Bueno la cosa esta asi:
Tengo una tabla "B" con 5 campos, de los cuales el campo 1 es una llave primaria, los campos 2 3 y 4 son una llave compuesta, y la tercer llave la componen los campos 2 3 4 y 5. Los campos 2 3 y 4 son el nombre de una persona, y sus apellidos, el campo 5 es la fecha de nacimiento, el campo 1 es un Id.

Tengo tabla "A" los registros revueltos con los datos sin normalizar, en donde existen muchos duplicados, tanto en los nombres, en el Id, y en las fechas de nacimiento.
Tengo una tabla "C" en donde pretendo colocar los registros rechazados por la tabla "B". Y además en ella misma colocar un campo que me indique cual de las llaves de la tabla "B" fue la que causo el rechazo de los datos.

De ahí viene la pregunta del manejo de errores en PErl.

Ojala y me pueda orientar.
rookie
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2006-03-01 18:48 @825

Notapor macgregor » 2006-05-31 10:48 @491

Código: Seleccionar todo
DBD::Oracle::st execute failed: ORA-00001: unique constraint (MICRO.PK_GPRFILE) violated (DBD ERROR: OCIStmtExecute) [for Statement "INSERT INTO ........."


Este tipo de errores son los que me aparecen en los logs de Apache con una base de datos Oracle.

No se como se podrían capturar desde Perl en tiempo de ejecución, tampoco se que DB utilizas, pero estoy seguro de que otros sistemas como MySql también generan este tipo de errores en los logs de apache.

Con Oracle debes poner nombre a las constraints, ya sean clave primaria o no, supongo que con otros SGBD's sucederá lo mismo, de manera que una opción sería parsear las últimas líneas del fichero log de Apache para saber que constraint ha fallado.

Espero que te ayude en algo.

Un saludo.
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa


Volver a Intermedio

¿Quién está conectado?

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

cron