Спящий режим внутри процедуры Informix SPL

StackOverflow https://stackoverflow.com/questions/5667

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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


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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

integer sysadmin:yieldn( integer nseconds )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top