Oracle: Aviso automático a otros programas

He hecho un programa en C++ que lee los datos de una tabla de Oracle. Necesito que cuando haya una modificación sobre esta tabla, el programa en C++ use ese valor actualizado. De momento he puesto un timer en mi programa y cuando se activa compruebo si ha habido cambios. Me gustaría hacerlo usando un trigger que avise al programa en C++ que se ha producido un cambio en la tabla de Oracle. ¿Es posible esto? ¿Cómo se haría?.

3 respuestas

Respuesta
1
Pues la única forma es que el trigger agregue datos en una tabla distinta y esta sea la que revises, cuando termines el proceso que comentas, eliminas el dato o datos y listo, siempre la debes tener vacía...
Gracias por contestar tan rápido.
La solución que sugieres me sigue obligando a hacer consultas periódicas de la base de datos, y me gustaría evitar eso. ¿No hay forma de que Oracle avise a mi aplicación?
Buscando en google he visto ejemplos de cómo enviar un correo desde una aplicación Oracle, de cómo generar un xml con los datos de una tabla, etc. ¿No hay ningún paquete o procedimiento PL/SQL para comunicarme de alguna forma con aplicaciones exernas?
Gracias.
No, porque son bases de datos lo que usas, lo que encuentras son procesos que puedes acceder por medio de oracle o de otros administradores de bases de datos, pero no más allá...
Respuesta
1
Si se puede hacer, pero es complicado, porque tienes que hacer un trigger que notifique de alguna manera a tu programa (que me imagino estará instalado en los equipos de los usuarios). Por favor, especifica un poco más cómo funciona tu programa y así poder ayudarte mejor.
Una alternativa es generar sockets de conexión. Entonces, tus clientes se conectan a este socket en el servidor y tu trigger pone los datos en el socket, entonces los clientes reciben la notificación y pueden realizar las acciones correspondientes.
Gracias por contestar tan rápido.
Mi programa funciona en linux, y simula el comportamiento de un escenario dado. Lee (usando la librería OTL) de una base de datos Oracle, que se encuentra en otro ordenador, los datos de configuración de ese escenario, y simula. Pero alguno de esos datos de la BD podría cambiar durante la simulación, y mi programa debería usar a partir de ese momento los nuevos datos para reflejar el cambio en la simulación.
Mi problema es que no sé cuando cambian esos datos. Ahora tengo un thread haciendo consultas periódicas y comparando los datos con los que ya había leído antes: una chapuza.
Quería hacer uso de los triggers para que me notifique un cambio en los datos, pero no sé cómo comunicarlo con mi programa. Sugieres sockets... ¿se puede establecer una comunicación por sockets entre el trigger y mi programa? ¿Cómo?
Gracias.
¿Java? Yo no sé nada de Java.
Te agradezco los enlaces, pero no les puedo sacar provecho. ¿Alguna otra forma?
Es difícil encontrar una solución más óptima que la que utilizas actualmente sin utilizar otros lenguajes como Java o C/C++, ya que estos tienen funciones nativas para conexiones TCP/IP y cosas como sockets.
Dentro de la web, estuve buscando sobre OTL y encontré que está construido en C. Quizás, si buscas más puedes encontrar alguna función que soporte notificaciones de triggers. En esto, lamentablemente no puedo seguir ayudándote, porque no conozco la herramienta.
Otra forma que se me ocurre, por lo menos, para que empieces a buscar al respecto, es con Integration Services de Oracle, que es una plataforma de comunicación con otros objetos que Oracle no los conoce en forma nativa. También puedes buscar sobre Notification Services, u otras herramientas similares.
En términos de diseño, quizás puedas escribir un programa sencillo en C que abra la conexión de socket (como servidor) y que esté esperando texto por el STDIN. Entonces, si logras configurar el tema de las notificaciones (por cualquier medio) le podrías pasar el texto a tu programita y problema solucionado.
No se me ocurre qué otro tipo de solución se puede implementar en Linux.
Respuesta
1
Puedes utilizar la orden host y puede mirar la sintaxis en cualquier manual de oracle pero para que tu programa se entere tendrás que habilitar un servidor que este escuchando. No se, con la información que tengo me gusta más la idea de un timmer.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas