Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Cancelar operación en Firebird

Buenos días.

En Firebird 2.5 se implementó la nueva función New fb_cancel_operation() en la API. Al llamar a esta función como ejemplo puedo en teoría detener la ejecución de un procedimiento almacenado.

Alguien la ha utilizado?

Existe equivalente PL/SQL que me permita ejecutar esta función de la API?
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #2  
Antiguo 29-05-2014
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
No ejecutando la función API directamente, pero prueba eliminando el registro de transacción de las tablas de monitoreo, más exactamente de tabla MON$STATEMENTS, eso debería en teoría ejecutar la función API que mencionas.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 29-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Sí, se supone que debería funcionar, pero no funciona.

Se trata de un procedimiento almacenado que realiza operaciones a través de un número de iteraciones que corresponde a un cálculo de coeficiente binomial... eso quiere decir, muchas iteraciones, entre más registros, más iteraciones. El SP puede tomar mucho tiempo, por lo cual es importante ofrecer al usuario la posibilidad de cancelar el proceso.

Al analizar la traza se la sesión nos damos cuenta de que al ejecutar el SP ya sea usando la sentencia SELECT o la sentencia EXECUTE PROCEDURE, el servidor no procesa nuevas solicitudes dentro de la misma sesión hasta tanto no termine la ejecución del SP. Esto sucede a pesar de que la ejecución del SP se realiza dentro de una transacción exclusiva.

Teniendo esta situación, no vale que ejecute cualquier tipo de sentencia, así sea dentro de otra transacción, ya que el servidor no la ejecutará hasta que finalice el SP.

De todas formas para salir de dudas inicié la ejecución del SP desde mi aplicación y luego desde IBExpert ejecuté una sentencia DELETE... COMMIT sobre la tabla MON$STATEMENTS, y nada; el registro, una vez eliminado vuelve a aparecer.

Bueno, se me han ocurrido otras cosas, como el uso de variables contextuales. Esto al comienzo fue una idea que creí podría funcionar, pero al final tampoco, ya que las variables contextuales funcionan en el contexto de una transacción o de una sesión. Como el servidor no realiza ninguna otra operación dentro de la sesión iniciada, no hay forma.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #4  
Antiguo 29-05-2014
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Es extraño que no funcionara tu prueba con el IBExpert, de hecho antes de responderte hice la misma prueba, casi que igual... y me funcionó correctamente.

Aunque lo que planteas sí me sucedió alguna vez con una versión 2.1 de Firebird, ¿probaste si ademas eliminas también el Attachement de la tabla MON$ATTACHMENTS?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 29-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Cierto, me adelante a una de las pruebas. Sí funciona eliminando el registro, pero únicamente si el SP se ejecuta mediante la sentencia SELECT. Cuando ejecuto el SP usando EXECUTE PROCEDURE no funciona. Completamente seguro.

Aún así, tengo el inconveniente mencionado. Funciona eliminado el registro desde IBExpert, pero dentro de mi aplicación no es posible ejecutar ninguna sentencia SQL mientras el SP no termine su ejecución, ni siquiera desde otra transacción. Se me ocurre que podría intentar realizar otra conexión, pero en este caso creo que no funciona si se usa Firebird Embedded... con Firebird Server por supuesto que sí... voy a probar y regreso.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #6  
Antiguo 29-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Por cierto, uso Firebird 2.5.2.26540
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #7  
Antiguo 30-05-2014
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Interesante prueba, ¿y si ejecutas el procedimiento en un hilo de ejecución aparte (Tthread), para después hacer el cancelado en otro botón si el usuario quiere?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 30-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Se me olvidaba decir que esa parte ya estaba implementada. El SP se ejecuta desde un TThread. Nada qué hacer al respecto. La cuestión es que es el servidor Firebird quien no procesa ninguna solicitud hasta tanto no termine, siempre que esta pertenezca a la misma sesión. Por eso estaba implementando la solución iniciando una nueva conexión.

Bueno, y acabo de hacerlo. botón 'Detener proceso' funciona perfectamente, aunque hasta este momento lo probé conectado a Firebird Server.

Creo que habían intentado dos conexiones desde la misma aplicación con Firebird Embedded y no había funcionado. Esa es la prueba que me dispongo a realizar...
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #9  
Antiguo 30-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Perfecto! No hay ningún inconveniente con Firebird Embedded. Inicio una nueva conexión, ejecuto la sentencia DELETE y la ejecución del SP se detiene tal y como sucede en Firebird Server.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #10  
Antiguo 30-05-2014
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por mlara Ver Mensaje
Perfecto! No hay ningún inconveniente con Firebird Embedded. Inicio una nueva conexión, ejecuto la sentencia DELETE y la ejecución del SP se detiene tal y como sucede en Firebird Server.
¡Genial!, me alegra dicha noticia. Aunque me deja pensativo el tema del execute procedure.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #11  
Antiguo 30-05-2014
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Cita:
Empezado por jhonny Ver Mensaje
Aunque me deja pensativo el tema del execute procedure.
Así es, incluso cuando se analizan las trazas se observa que las acciones del servidor no son las mismas al comprar las realizadas cuando se ejecutan la sentencias EXECUTE PROCEDURE y SELECT.

EXECUTE PROCEDURE ProcName Param1, Param2:

START_TRANSACTION
EXECUTE_PROCEDURE_START
EXECUTE_PROCEDURE_FINISH
COMMIT_RETAINING

SELECT * FROM ProcName(Param1, Param2):

PREPARE_STATEMENT
EXECUTE_STATEMENT_START
EXECUTE_PROCEDURE_START
EXECUTE_STATEMENT_FINISH
CLOSE_CURSOR

El caso es que al intentar detener el procedimiento ejecutado mediante la sentencia EXECUTE PROCEDURE, como mencioné antes, el registro vuelve a aparecer y la ejecución no se detiene.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
Respuesta



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
cancelar un insert en Firebird ebeltete Firebird e Interbase 3 24-07-2013 17:55:12
Operacion Not applicable Yun-i Varios 5 25-04-2012 22:58:05
Qué significa la operación X^Y meguzman C++ Builder 6 19-08-2008 08:49:17
Operacion con Hexadecimales BetoAlonso Varios 11 26-02-2008 00:40:25
Operación Papa Julián Debates 13 05-05-2005 15:04:52


La franja horaria es GMT +2. Ahora son las 19:05:02.


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