Vie May 26, 2006 9:24 am
|
 |
rookie
Perlero Nuevo

|
Registrado: 01 Mar 2006
Mensajes: 39
|
|
| Cómo manejar errores en Perl |
|
|
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: |
| $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. |
|
|
|

Vie May 26, 2006 9:38 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
Respuesta rápida no probada:
| Código: |
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";
} |
|
|

Vie May 26, 2006 1:57 pm
|
 |
rookie
Perlero Nuevo

|
Registrado: 01 Mar 2006
Mensajes: 39
|
|
|
|
|
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! |
|

Sab May 27, 2006 1:45 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Lun May 29, 2006 2:57 pm
|
 |
rookie
Perlero Nuevo

|
Registrado: 01 Mar 2006
Mensajes: 39
|
|
|
|
|
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. |
|

Mie May 31, 2006 9:48 am
|
 |
macgregor
Perlero Frecuente

|
Registrado: 09 Dic 2004
Mensajes: 117
Ubicación: españa
|
|
|
|
|
| Código: |
| 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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|