从Informix SPL过程中入睡
在Informix SPL例程中进行与传统sleep()系统调用的语义等效的最佳方法是什么?换句话说,只需"暂停" N秒(或者毫秒或者其他任何时间,但是秒就可以了)。我正在寻找一种不涉及将一些新的(也许是我写的)C代码或者其他库链接到Informix服务器的解决方案。我必须完全可以从SPL中做到这一点。对于IDS 10或者11的解决方案就可以了。
@RET对我而言,"显而易见"的答案并不明显!我不了解SYSTEM命令。谢谢! (是的,我是我们认为的我。)
是的,仅用于调试目的。不幸的是,SPL中的CURRENT将始终返回相同的值,该值在调用项中设置:
"any call to CURRENT from inside the SPL function that an EXECUTE FUNCTION (or EXECUTE PROCEDURE) statement invokes returns the value of the system clock when the SPL function starts." —IBM Informix Guide to SQL
在自己的子例程中包装CURRENT并没有帮助。在第一次调用包装器时,我们确实得到了不同的答案(前提是我们使用的是YEAR TO FRACTION(5)或者其他类型的具有足够高的分辨率以显示差异),但随后在每个单个包装上都得到了相同的值后续调用,以确保任何循环都不会终止。
解决方案
回答
我假设我们希望此"暂停"用于调试目的,否则请考虑一下,对于服务器,总会有比睡眠更好的任务...
一个建议:也许我们可以得到CURRENT,将其添加几秒钟(让mytimestamp),然后在while循环中选择CURRENT,而CURRENT <= mytimestamp。我没有在办公桌周围设置notifyix的方法来尝试使用它,因此我们必须确定正确的语法。同样,请勿在生产服务器上放置此类hack。我们已被警告:D
回答
然后,我们必须在要从第一个调用的另一个函数中扭曲CURRENT(但这是前一个hack的一个hack ...)。
回答
一定有很好的理由,我们不想要显而易见的答案:
`SYSTEM" sleep 5"。如果我们只想在检查各种值等时让SPL暂停,这是一些想法(当然,所有这些都是完全不正确的做法):
- 将TRACE FILE命名为命名管道(假设Unix后端),使其阻塞直到我们选择从中读取,或者
- 创建另一个表,SPL从WHILE循环中为特定条目轮询该表,然后从其他位置插入所述行(效率极低)
- 将SET LOCK MODE设置为朋友:执行" SET LOCK MODE TO WAIT n"并故意重新查询我们已经打开游标的表。当然,我们需要将其包装在EXCEPTION处理程序中。
希望能对我们有所帮助(如果我们是Ars和Rose :: DB的同名JS,那是我所能做的最少的事;-)