Pregunta

¿Cuál es la mejor manera de hacer el equivalente semántico de la tradicional sleep() llamada al sistema desde dentro de una Informix SPL rutina?En otras palabras, simplemente "pausa" por N segundos (o milisegundos o lo que sea, pero los segundos están bien).Estoy buscando una solución que no no involucrar a la vinculación de algunos de los nuevos (tal vez escrito por mí) código de C o de la biblioteca en el servidor de Informix.Esto tiene que ser algo que yo pueda hacer puramente de SPL.Una solución para los IDENTIFICADORES de 10 o 11 estaría bien.

@RET - El "obvio" que la respuesta no era obvio para mí!Yo no sabía acerca de los comandos del SISTEMA.Gracias!(Y sí, soy el tipo que tu crees que soy.)


Sí, es sólo con fines de depuración.Desgraciadamente, la ACTUAL dentro de un SPL siempre devolverá el mismo valor, en la entrada a la llamada:

"cualquier llamada a la ACTUAL desde el interior de la función de SPL que una FUNCIÓN EXECUTE (EJECUTAR el PROCEDIMIENTO de instrucción invoca devuelve el valor del reloj del sistema cuando la función de SPL se inicia."

IBM Informix Guía de SQL

Envolver ACTUAL en su propia subrutina no ayuda.Usted recibirá una respuesta diferente en la primera llamada a su contenedor (siempre y cuando esté utilizando el AÑO DE FRACCIÓN(5) o de algún otro tipo con alta resolución suficiente para mostrar la diferencia), pero luego se obtiene el mismo valor en cada llamada posterior, que se asegura de que cualquier tipo de bucle nunca va a terminar.

¿Fue útil?

Solución

Debe haber alguna buena razón por la que no quieren la respuesta obvia:SYSTEM "sleep 5".Si todo lo que estamos queriendo es para el SPL para hacer una pausa y revisar diversos valores, etc, aquí hay un par de pensamientos (todos de los cuales son de absoluta hacks, por supuesto):

  1. Hacer que el ARCHIVO de TRAZA una tubería con nombre (suponiendo Unix back-end), por lo que se bloquea hasta que usted elija para leer de ella, o
  2. Crear otra tabla que tu SPL encuestas para una entrada en particular a partir de un bucle while, y de insertar en dicho fila de otros lugares (terriblemente ineficiente)
  3. Hacer que ESTABLECE el MODO de BLOQUEO de tu amigo:ejecutar "ESTABLECER el MODO de BLOQUEO de ESPERAR n" y deliberadamente a consultar una tabla que ya estás sosteniendo un cursor abierto en.Usted necesitará para terminar en un controlador de excepciones, por supuesto.

La esperanza de que es un poco de ayuda (y si tienes el mismo JS de Ars y Rose::DB fama, es lo menos que podía hacer ;-)

Otros consejos

Supongo que usted desea que esta "pausa" para propósitos de depuración, de lo contrario, pensar, siempre tendrás algo mejor las tareas a realizar para el servidor de dormir ...

Una sugerencia:Tal vez usted podría conseguir ACTUAL, añadir un par de segundos ( vamos mytimestamp ), a continuación, en un bucle while, seleccione ACTUAL, mientras que la ACTUAL <= mytimestamp .No tengo informix instalación de alrededor de mi escritorio, para probarlo, así que tendrás que figura la sintaxis correcta.De nuevo, no poner un hack en un servidor de producción.Usted ha sido advertido :D

A continuación, deberás de deformación ACTUAL de otra función que vas a llamar a partir de la primera (pero este es un hack en el anterior truco ...).

Soy consciente de que la respuesta es demasiado tarde.Sin embargo, recientemente he encontrado con el mismo problema y este sitio se muestra como la primera.Por lo que es beneficioso para otras personas para colocar los nuevos responder aquí.

Solución perfecta fue encontrado por Eric Herber y publicado en abril de 2012 aquí: Cómo dormir (o rendimiento) para un tiempo fijo en un procedimiento almacenado Por desgracia, este sitio está caído.

Su solución es utilizar la siguiente función:

integer sysadmin:yieldn( integer nseconds )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top