4

从 Informix SPL 例程中执行与传统 sleep() 系统调用的语义等效的最佳方法是什么?换句话说,只需“暂停” N 秒(或毫秒或其他什么,但几秒就可以了)。我正在寻找一种涉及将一些新的(可能由我编写的)C 代码或其他库链接到 Informix 服务器的解决方案。这必须是我可以完全从 SPL 做的事情。IDS 10 或 11 的解决方案会很好。

@RET - “显而易见”的答案对我来说并不明显!我不知道 SYSTEM 命令。谢谢!(是的,我就是你认为的那个人。)


是的,它仅用于调试目的。不幸的是,SPL 中的 CURRENT 将始终返回相同的值,在调用的入口处设置:

“从 SPL 函数内部对 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句调用的任何对 CURRENT 的调用都会在 SPL 函数启动时返回系统时钟的值。”

IBM Informix SQL 指南

将 CURRENT 包装在它自己的子程序中没有帮助。在第一次调用包装器时,您确实会得到不同的答案(前提是您使用的是 YEAR TO FRACTION(5) 或其他具有足够高的分辨率来显示差异的类型),但随后您会在每一个上得到相同的值随后的调用,确保任何类型的循环都不会终止。

4

4 回答 4

2

您不想要明显的答案一定有一些很好的理由: SYSTEM "sleep 5". 如果您只想在检查各种值等时让 SPL 暂停,这里有几个想法(当然,所有这些都是完全的 hack):

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

希望这会有所帮助(如果您是 Ars 和 Rose::DB 名气的同一个 JS,这是我能做的至少 ;-)

于 2008-09-17T05:45:52.350 回答
1

我知道答案为时已晚。但是我最近遇到了同样的问题,这个网站显示为第一个。因此,在此处放置新的 anwser 对其他人是有益的。

完美的解决方案由 Eric Herber 发现并于 2012 年 4 月在此处发布:如何在存储过程中固定时间休眠(或屈服) 不幸的是,该站点已关闭。

他的解决方案是使用以下功能:

integer sysadmin:yieldn( integer nseconds )
于 2018-07-25T16:48:46.013 回答
0

我假设您希望此“暂停”用于调试目的,否则请考虑一下,您总是有一些比睡眠更好的任务要为您的服务器做......

一个建议:也许你可以得到 CURRENT,添加它几秒钟(让 mytimestamp )然后在一个 while 循环中选择 CURRENT 而 CURRENT <= mytimestamp 。我没有在我的办公桌周围设置 informix 来尝试它,所以你必须弄清楚正确的语法。同样,不要在生产服务器上放置这样的 hack。您已被警告:D

于 2008-08-10T16:58:39.887 回答
0

然后你将不得不在另一个你将从第一个调用的函数中扭曲 CURRENT (但这是对前一个 hack 的一个 hack ...)。

于 2008-08-11T08:43:31.583 回答