在 Informix SPL 过程中休眠
Posted
技术标签:
【中文标题】在 Informix SPL 过程中休眠【英文标题】:Sleep from within an Informix SPL procedure 【发布时间】:2008-08-08 04:36:30 【问题描述】:在 Informix SPL 例程中执行与传统 sleep() 系统调用的语义等效的最佳方法是什么?换句话说,只需“暂停” N 秒(或毫秒或其他什么,但几秒就可以了)。我正在寻找一种不涉及将一些新的(可能由我编写的)C 代码或其他库链接到 Informix 服务器的解决方案。这必须是我可以完全从 SPL 做的事情。 IDS 10 或 11 的解决方案就可以了。
@RET - “显而易见”的答案对我来说并不明显!我不知道 SYSTEM 命令。谢谢! (是的,我就是你认为的那个人。)
是的,它仅用于调试目的。不幸的是,SPL 中的 CURRENT 将始终返回相同的值,在调用入口处设置:
“任何从 SPL 函数内部调用 CURRENT 的 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句都会在 SPL 函数启动时返回系统时钟的值。”
—IBM Informix Guide to SQL
将 CURRENT 包装在它自己的子程序中没有帮助。在第一次调用包装器时,您确实会得到不同的答案(前提是您使用的是 YEAR TO FRACTION(5) 或其他具有足够高分辨率以显示差异的类型),但随后您会在每一个上得到相同的值后续调用,确保任何类型的循环都不会终止。
【问题讨论】:
【参考方案1】:您不希望得到明显的答案一定有充分的理由:
SYSTEM "sleep 5"
。如果您只想让 SPL 在您检查各种值等时暂停,这里有几个想法(当然,所有这些都是完全的 hack):
-
将 TRACE FILE 设为命名管道(假设为 Unix 后端),因此它会阻塞,直到您选择从中读取,或者
创建另一个表,您的 SPL 从 WHILE 循环中轮询特定条目,然后从其他地方插入所述行(效率极低)
让 SET LOCK MODE 成为您的朋友:执行“SET LOCK MODE TO WAIT n”并故意重新查询您已经打开游标的表。当然,您需要将其包装在 EXCEPTION 处理程序中。
希望这能有所帮助(如果你是 Ars 和 Rose::DB 的同一个 JS,那我能做的最少 ;-)
【讨论】:
【参考方案2】:我知道答案为时已晚。但是我最近遇到了同样的问题,这个网站显示为第一个。所以在这里放置新的anwser对其他人是有益的。
Eric Herber 发现了完美的解决方案,并于 2012 年 4 月在此处发布:How to sleep (or yield) for a fixed time in a stored procedure 不幸的是,该网站已关闭。
他的解决方案是使用以下函数:
integer sysadmin:yieldn( integer nseconds )
【讨论】:
【参考方案3】:我假设您希望此“暂停”用于调试目的,否则请考虑一下,您总是有一些比睡眠更好的任务要为您的服务器执行...
一个建议:也许你可以得到 CURRENT,添加几秒钟(让 mytimestamp),然后在 while 循环中选择 CURRENT while CURRENT
【讨论】:
CURRENT 在*** SQL 语句运行时不会更改。有一个 DBINFO() 可以 - 并且 sysmaster 中有信息可以。【参考方案4】:然后你必须在另一个函数中扭曲 CURRENT ,你将从第一个调用的函数中(但这是对前一个 hack 的一个 hack ...)。
【讨论】:
以上是关于在 Informix SPL 过程中休眠的主要内容,如果未能解决你的问题,请参考以下文章