在 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 过程中休眠的主要内容,如果未能解决你的问题,请参考以下文章

在线程池中休眠的线程

在 JavaScript 中休眠 - 动作之间的延迟

在 Swift 中休眠或延迟 Timer 线程

在批处理文件中休眠

为啥要在 bash 中休眠和等待?

在 16 位裸机 nasm 组件中休眠 x 毫秒