Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Exception en Procedimiento Almacenado (https://www.clubdelphi.com/foros/showthread.php?t=78367)

Neeruu 12-04-2012 14:08:16

Exception en Procedimiento Almacenado
 
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:

Código SQL [-]
/* 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';

Código Delphi [-]
/* 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):

Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 17:17:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi