Сон из процедуры Informix SPL - PullRequest
2 голосов
/ 08 августа 2008

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

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


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

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

& ndash;
Руководство IBM Informix по SQL

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

Ответы [ 4 ]

1 голос
/ 17 сентября 2008

Должна быть веская причина, по которой вы не хотите получить очевидный ответ: 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 слава, это меньшее, что я мог бы сделать; -)

0 голосов
/ 25 июля 2018

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

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

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

integer sysadmin:yieldn( integer nseconds )
0 голосов
/ 11 августа 2008

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

0 голосов
/ 10 августа 2008

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

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

...