从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)或者其他类型的分辨率足够高的其他类型来显示它们之间的差异),但是每次都会得到相同的值随后的调用,这确保了任何类型的循环都不会终止。

0

3 答案

必须有一些很好的理由,你不想要明显的答案: SYSTEM“sleep 5”。如果你只想让SPL在你检查各种值的时候暂停,这里有一些想法(当然,所有这些都是彻头彻尾的黑客):

  1. 使TRACE FILE成为一个命名管道(假设为Unix后端),所以它会阻塞,直到您选择读取它为止,或者
  2. 创建另一个表,您的SPL为WHILE循环中的特定条目轮询,并从别处插入所述行(非常低效)
  3. 将SET LOCK MODE设为您的朋友:执行“SET LOCK MODE TO WAIT n”,并故意重新查找已打开光标的表格。当然,您需要将其包装在EXCEPTION处理程序中。

希望这是一些帮助(如果你是Ars和Rose :: DB名气相同的JS,这是我能做的最少的;-)

0
额外

我假设你为了调试目的而想要“暂停”,否则考虑一下,对于服务器,你总是会有比睡眠更好的任务。

A suggestion: Maybe you could get CURRENT, add it a few seconds ( let mytimestamp ) then in a while loop select CURRENT while CURRENT <= mytimestamp . I've no informix setup around my desk to try it, so you'll have to figure the correct syntax. Again, do not put such a hack on a production server. You've been warned :D

0
额外
在运行顶级SQL语句时,CURRENT不会更改。有一个DBINFO()这样做 - 并且在sysmaster中有信息。
额外 作者 Jonathan Leffler,

然后,你必须在另一个函数中改变CURRENT,你会从第一个函数中调用CURRENT(但这是对先前黑客的破解......)。

0
额外