Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2012
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 484
Poder: 17
Neeruu Va por buen camino
Cool 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!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #2  
Antiguo 12-04-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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

Última edición por duilioisola fecha: 12-04-2012 a las 16:51:57.
Responder Con Cita
  #3  
Antiguo 12-04-2012
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 484
Poder: 17
Neeruu Va por buen camino
Cool

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!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #4  
Antiguo 13-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ese suspend creo que no sirve para nada
Responder Con Cita
  #5  
Antiguo 13-04-2012
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 484
Poder: 17
Neeruu Va por buen camino
Cool

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!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #6  
Antiguo 13-04-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
procedimiento almacenado sargento elias Firebird e Interbase 1 14-04-2008 14:04:35
Procedimiento almacenado efelix MS SQL Server 7 21-11-2007 18:53:00
Procedimiento Almacenado rodrigo19 Oracle 5 22-08-2007 23:55:40
Procedimiento Almacenado scooterjgm Conexión con bases de datos 5 18-01-2005 19:21:32
procedimiento almacenado haron Firebird e Interbase 2 29-09-2003 02:09:56


La franja horaria es GMT +2. Ahora son las 13:45:58.


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
Copyright 1996-2007 Club Delphi