从Informix SPL过程中休眠

时间:2008-08-08 04:36:31

标签: informix spl

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

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


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

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

- IBM Informix Guide to SQL

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

4 个答案:

答案 0 :(得分:1)

必须有一些充分的理由让你不想要明显的答案: SYSTEM "sleep 5"。如果您想要的是SPL在您检查各种值等时暂停,那么这里有几个想法(当然所有这些都是彻底的黑客攻击):

  1. 将TRACE FILE设为命名管道(假设是Unix后端),因此它会阻塞,直到您选择从中读取,或
  2. 创建另一个表,SPL轮询来自WHILE循环的特定条目,并从其他地方插入所述行(非常低效)
  3. 让SET LOCK MODE成为你的朋友:执行“SET LOCK MODE TO WAIT n”并故意重新查询你已经打开游标的表格。当然,您需要将它包装在EXCEPTION处理程序中。
  4. 希望这是一些帮助(如果你是同一个Ars和Rose :: DB成名的JS,那是我能做的最少的事情; - )

答案 1 :(得分:0)

我认为你希望这个“暂停”用于调试目的,否则考虑一下,你总是会为你的服务器做一些比睡眠更好的任务......

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我知道答案为时已晚。但是我最近遇到了同样的问题,该站点显示为第一个。因此,对其他人来说,在这里放置新的保险柜是有益的。

完美解决方案由埃里克·赫伯(Eric Herber)找到,并于2012年4月发布在这里:How to sleep (or yield) for a fixed time in a stored procedure 不幸的是,该站点已关闭。

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

integer sysadmin:yieldn( integer nseconds )