PDA

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