Ver la Versión Completa : Exception en Procedimiento Almacenado
Neeruu
12-04-2012, 14:08:16
Hola a todos...
Tengo un procedimiento almacenado, que recorre las tablas de mi base de datos, y a cada tabla le agrega un campo en función a otro.
Por ejemplo:
Campo1 --> Creo Campo 2
Ahora el Problema es si en alguna tabla falta ese "Campo1" se interrumpe el procedimiento y no se como generar algún mensaje o exception que me avise o informe que se produjo un error ....
Cuando creo el "Campo2" lo hago de la siguiente forma:
EXECUTE STATEMENT DESCRIPCION;
Donde "DESCRIPCION" contiene la Sentencia SQL para crear el campo. Pero si esto falla, la ejecucion se corta y no me entero.
Ahora la Pregunta:
Como puedo saber si un Execute Statement se a ejecutado correctamente o no?
Como puedo Mostrar un Excepcion cuando no se ejecuta correctamente?
Saluda Atte Neeruu!!! :)
duilioisola
12-04-2012, 15:45:29
Si estamos hablando de bases de datos Firebird:
/* Excepcion para generar un mensaje de error */
create exception err_breakpoint 'Error';
/* Procedimiento o trigger donde debe capturarse la excepcion */
trigger/store procedure
begin
descripcion = 'ALTER TABLE TTT ADD CAMPO2 INTEGER';
execute statemente descripcion;
/* Capturo la excepcion */
/* ANY es cualquier excepcion */
/* Tambien se pueden poner los valores de cada excepcion individual */
when any do
begin
exception err_breakpoint 'Ha ocurrido un error al ejecutar ' || descripcion
end;
end
Neeruu
12-04-2012, 22:40:13
Hola..... Si estamos hablando de Firebird....
El ejemplo que pones compila... No he Probado si anda.... pero compila....
El problema se me da cuando tengo esta situación:
/* Excepcion para generar un mensaje de error */
create exception err_breakpoint 'Error';
/* Procedimiento o trigger donde debe capturarse la excepcion */
trigger/store procedure
begin
descripcion = 'ALTER TABLE TTT ADD CAMPO2 INTEGER';
execute statemente descripcion;
/* Capturo la excepcion */
/* ANY es cualquier excepcion */
/* Tambien se pueden poner los valores de cada excepcion individual */
when any do
begin
exception err_breakpoint 'Ha ocurrido un error al ejecutar ' || descripcion
end;
Suspend; //Y ACA ES DONDE ME DICE " parsing error - suspend."
end
Porque? no se... me gustaría saber, si alguien me pudiera explicar.... agredecido estare....
Saluda atte Neeruu!!!:)
Casimiro Notevi
13-04-2012, 00:00:17
Ese suspend creo que no sirve para nada
Neeruu
13-04-2012, 02:41:59
En mi caso si sirve.... aparte después del execute sigo haciendo cosas.... y me da error de compilación....
Alguna idea de porque es así?
Saludos Atte Neeruu!!!:)
duilioisola
13-04-2012, 10:26:54
El problema es que todo el bloque que "puede fallar" debe ir entre un begin y un end.
Tiene que ver con las trasacciones.
No recuerdo donde lo lei, pero parece ser que lo que va entre en un bloque, se realiza en una transacción y asi pueden capturarse.
Esto si funciona, (lo he probado, FB 1.5):
create procedure AAA_PRUEBA
returns (errores integer)
as
declare variable instruccion varchar(100);
begin
/* Cantidad de errores */
errores = 0;
/* SQL a ejecutar */
begin
instruccion = 'ALTER TABLE TTT ADD CAMPO2 INTEGER';
execute statement instruccion ;
/* Capturo la excepcion */
/* ANY es cualquier excepcion */
/* Tambien se pueden poner los valores de cada excepcion individual */
when any do
begin
errores = errores + 1;
exception err_breakpoint 'Hubo un error haciendo ' || instruccion ;
end
end
/* Hago mas cosas si no huno errores */
if (errores = 0) then
begin
instruccion = 'UPDATE TTT SET CAMPO2=0';
execute statement instruccion ;
/* Capturo la excepcion nuevamente */
when any do
begin
errores = errores + 1;
exception err_breakpoint 'Hubo un error haciendo ' || instruccion ;
end
end
suspend;
end
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.