Сон из процедуры Informix SPL

Каков наилучший способ сделать семантический эквивалент традиционного системного вызова sleep () из процедуры Informix SPL? Другими словами, просто «пауза» на N секунд (или миллисекунды или что-то еще, но секунды в порядке). Я ищу решение, которое не предполагает связывание какого-либо нового (возможно, написанного мной) кода C или другой библиотеки с сервером Informix. Это должно быть то, что я могу сделать чисто из SPL. Решение для IDS 10 или 11 было бы хорошо.

@RET - «очевидный» ответ не был очевиден для меня! Я не знал о команде SYSTEM. Спасибо! (И да, я тот парень, о котором ты думаешь.)


Да, это только для целей отладки. К сожалению, CURRENT в SPL всегда будет возвращать одно и то же значение, установленное при входе в вызов:

«любой вызов CURRENT изнутри функции SPL, которую вызывает оператор EXECUTE FUNCTION (или EXECUTE PROCEDURE), возвращает значение системных часов при запуске функции SPL».

- IBM Informix Руководство по SQL

Заворачивание CURRENT в собственную подпрограмму не помогает. Вы получаете другой ответ при первом обращении к вашей оболочке (при условии, что вы используете YEAR TO FRACTION (5) или какой-либо другой тип с достаточно высоким разрешением, чтобы показать разницу), но затем вы получаете то же значение обратно на каждый последующий вызов, который гарантирует, что цикл любого рода никогда не прекратится.

8.08.2008 04:36:30
4 ОТВЕТА
РЕШЕНИЕ

Там должен быть какой - то хорошая причина , вы не желая очевидный ответ: SYSTEM "sleep 5". Если все, что вам нужно, это приостановить SPL, пока вы проверяете различные значения и т. Д., Вот пара соображений (все из которых, конечно, являются полными взломами):

  1. Сделайте TRACE FILE именованным каналом (при условии, что сервер Unix), поэтому он блокируется, пока вы не решите читать из него, или
  2. Создайте другую таблицу, которую ваш SPL опрашивает для определенной записи из цикла WHILE, и вставьте указанную строку из другого места (ужасно неэффективно)
  3. Сделайте SET LOCK MODE своим другом: выполните «SET LOCK MODE TO WAIT n» и сознательно запросите таблицу, на которой уже открыт курсор. Конечно, вам нужно будет обернуть это в обработчик ИСКЛЮЧЕНИЯ.

Надеюсь, это поможет (и если вы тот же JS, что и Ars и Rose :: DB слава, это меньшее, что я мог бы сделать ;-)

1
17.09.2008 05:45:52

Я предполагаю, что вы хотите эту «паузу» для целей отладки, иначе подумайте, у вас всегда будут задачи лучше для вашего сервера, чем для сна ...

Совет: возможно, вы могли бы получить CURRENT, добавить его через несколько секунд (пусть mytimestamp), а затем в цикле while выбрать CURRENT, а CURRENT <= mytimestamp. Я не настроил информкс на своем столе, чтобы попробовать его, поэтому вам нужно будет определить правильный синтаксис. Опять же, не ставьте такой взлом на рабочий сервер. Вы были предупреждены: D

0
10.08.2008 16:58:39
CURRENT не изменяется во время выполнения оператора SQL верхнего уровня. Есть DBINFO (), который делает - и есть информация в sysmaster, которая делает.
Jonathan Leffler 25.09.2008 00:15:26

Затем вам придется деформировать CURRENT в другой функции, которую вы будете вызывать с первого раза (но это взлом предыдущего взлома ...).

0
11.08.2008 08:43:31

Я знаю, что ответ слишком поздно. Однако недавно я столкнулся с той же проблемой, и этот сайт показывается как первый. Поэтому другим людям выгодно размещать здесь новые ответы.

Эрик Гербер нашел идеальное решение и опубликовал в апреле 2012 года здесь: как спать (или давать) в течение фиксированного времени в хранимой процедуре. К сожалению, этот сайт не работает.

Его решение заключается в использовании следующей функции:

integer sysadmin:yieldn( integer nseconds )
0
25.07.2018 16:48:46