• Publicidad

Capturar un error de base de datos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Capturar un error de base de datos

Notapor Moraita » 2009-04-14 05:19 @263

¡Hola!

Me gustaría poder capturar los errores que obtengo al intentar ejecutar un sql en una base de datos.

Algo así como la sentencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $sth =$dbh_sre->prepare($sql) or &error("ERROR preparing query to run in database: couldn't prepare $DBI::errstr");
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La subrutina "&error" a su vez inserta el error en la base de datos...

¿Alguien tiene alguna idea?, he leído algo de raiserror pero no lo entiendo muy bien.., no sé si van por ahí los tiros...

¡Gracias!
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475

Publicidad

Notapor explorer » 2009-04-14 05:30 @270

¿A qué te refieres con lo de capturar?

Si el error se inserta en la base de datos, ¿qué es lo que quieres hacer entonces con ellos?

A la hora de ejecutar las funciones de base de datos, suelen devolver un valor nulo o indefinido en el caso de error (por eso la presencia del operador 'or'). Si fallan, entonces se ejecuta la función &error() (que estará definida en otro sitio del programa) que se encargará de realizar algo con ese error: informar al usuario, guardarlo en el registro de actividad, etc.
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 Moraita » 2009-04-14 05:48 @283

Con capturar me refiero a que en el momento que ocurra el error yo realice una o varias acciones.

En efecto, explorer, eso es exactamente lo que yo quiero, que en el momento de producirse el error la subrutina &error() registre el error en una tabla de la base de datos y escriba también el error en un fichero log, hacer un exit() y... lo que sea,
pero no hace eso, simplemente ocurre un error y el programa se para y no hace nada.

Sentencia que yo ejecuto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sth =$dbh_sre->prepare($sql) or &error("ERROR accesing r_cube_ctrl and temp_load_ctrl while collecting rows to process: couldn't prepare $DBI::errstr");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


al ejecutar obtengo en pantalla:
Código: Seleccionar todo
thread failed to start: DBD::Oracle::db prepare failed: ORA-00904: "VAR1": invalid identifier (DBD ERROR: error possibly near <*> indicator at char 125 in 'select sum(cubetype) as cubetype, sum(dimensionflag) as dimensionflag,max(cdctime)as time from cube_ctrl where partitionid = <*>VAR1 and status = 'PENDING'') [for Statement "select sum(cubetype) as cubetype, sum(dimensionflag) as dimensionflag,max(cdctime)as time from cube_ctrl where partitionid = VAR1 and status = 'PENDING'"] at ccx_updateCube.pl line 460.
14/04/09 114537---TRACK: select to be run: select sum(cubetype) as cubetype, sum(dimensionflag) as dimensionflag,max(cdctime)as time from cube_ctrl where partitionid = VAR1 and status = 'PENDING'


En este punto está colgado el programa y además no ha hecho nada de lo que yo le he dicho que haga después del "or".

¿Me he explicado bien?
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475

Notapor explorer » 2009-04-14 07:03 @335

Sí que te has explicado bien :wink:

A ver... según la documentación de DBI, si sale ese error es porque tienes activada la opción RaiseError.

Según esa misma documentación, es típico usar una construcción eval{...} para capturar esos mensajes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  eval {
    ...
    $sth->execute();
    ...
  };
  if ($@) {
    # $sth->err y $DBI::err serán verdadeo si ocurrió un error desde DBI
    warn $@; # imprime el error
    ... # hacer lo que sea necesario para manejar el error
  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por otra parte, veo que el error es por no haber entrecomillado VAR1. Es mejor usar el sistema de 'binding' con prepare() y execute(), que construir la sql desde cero.
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 Moraita » 2009-04-14 08:26 @393

yessss,

Sí, de hecho ya había probado con el eval(), pero viendo tu ejemplo me he dado cuenta que lo había hecho mal, o bueno, al menos no me había funcionado (producto de un embotellamiento cerebral claro está, porque ya me dirás tú lo simple que era).

Gracias, ¡ya capturo el error y hago lo que quiero!
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475


Volver a Básico

¿Quién está conectado?

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

cron