2012-05-12 26 views
7

Hola, tengo un procedimiento almacenado que me gustaría ejecutar para siempre, pero dormir por un segundo en un bucle ... cuando se despierta, sondearía una tabla para ver si debería hacer algún trabajo. El trabajo solo debe hacerse cada minuto, por lo que no hay que preocuparse de que la mesa de votación reciba actualizaciones de dos escritores al mismo tiempo.¿hay alguna manera de dormir() en un procedimiento almacenado?

¿Cuál es la mejor manera de dormir() durante un intervalo en un sproc? Sería bueno, en realidad, si pudiera dormir durante 200 milisegundos (actualmente), pero un segundo también funcionaría.

Don

+0

¿No hay una facilidad de programación en la base de datos? Incluso MySQL tiene uno. – EJP

+0

No lo sé ... ¿está ahí? No estoy seguro de lo fácil que sería implementar una instalación sleep() dentro de la base de datos. De hecho, al pensarlo, sería extremadamente difícil. –

+0

http://dev.mysql.com/doc/refman/5.1/en/events.html – goat

Respuesta

0

Usted no especifica qué base de datos que está utilizando, pero en general la manera de achive lo que quiere es no tener un sproc infinetly funcionando, pero tener algún componente externo - como un planificador o del Agente SQL Server en MSSQL: ejecuta el sproc de vez en cuando.

+0

La pregunta está etiquetada mysql ... – eggyal

+0

la base de datos es mysql. sí - Me gustaría tener un proceso externo ejecute esto de vez en cuando si no hay forma de hacerlo dentro de la base de datos. –

0

Usaría cron (linux) o Windows Task Scheduler (windows) para programar que se ejecute cada minuto, y hacer que el procedimiento almacenado complete su tarea, luego salir.

Tener procs almacenados en ejecución "para siempre" es realmente mala idea. Usted tiene conexiones de larga duración (que pueden morir), puede bloquear inadvertidamente una tabla (para siempre), etc.

Como no tienen nada que ver entre sí, separar su "bucle" de su "tarea" es bueno diseño, y significa que puede usar (diferentes) herramientas que son más apropiadas para cada parte.

14

He encontrado el mismo problema. Después de buscar en Google mucho, descubrí que podemos usar

SELECT SLEEP(<seconds>); 

para retrasar nuestros procedimientos durante tantos segundos. En su caso, usando

SELECT SLEEP(0.2); 

estaría bien.

+2

Además, si no necesita los resultados de la consulta (que probablemente no, ya que el seleccionar dormir() solo trae un 0) puede usar "DORMIR ();" – Diego

+0

Esto no funcionó para mí. Estoy usando Oracle 11g. – sebadagostino

Cuestiones relacionadas