Приостанов выполнения процедуры

Синтаксис
 
sleep(< длительность >)

< длительность > – целочисленное положительное значение типа BIGINT (константа).

Описание

Функция SLEEP предназначена для «усыпления» хранимой процедуры, в контексте которой она была вызвана. При этом управление передаётся другим работающим в данное время запросам (процедурам) канала. По прошествии промежутка времени, заданного аргументом функции, процедуре возвращается управление, и она продолжает свою работу (это не означает, что управление функции будет передано немедленно по прошествии этого интервала, управление будет передано на очередном кванте, выделенном СУБД для канала, в котором обрабатывается процедура).

Аргумент < длительность > задаёт количество миллисекунд, на которое процедура должна уснуть. Максимальное значение равно 0x3FFFFFFF (или 1073741823 в десятичной записи), что составляет приблизительно 12.4 суток.

Примечание

На определенных платформах по объективным причинам разрешающая способность таймера может быть грубее ожидаемой.

Примеры
С помощью утилиты inl создаём две процедуры, печатающие на консоль локально запущенного ядра СУБД ЛИНТЕР время до и после выполнения функции sleep, причём первая процедура «засыпает» на 1 секунду, а вторая – на 5 секунд:
create or replace procedure test_sleep1(in n int) for debug
declare
  var i int; //
code
  i := 0; //
  while i < = n loop
    print("--- Proc 1 start (1 sec): " + dtoa(SYSDATE())); //
    sleep(1000); //
    print("--- Proc 1 stop  (1 sec): " + dtoa(SYSDATE())); //
    i := i + 1; //
  endloop; //
end;

create or replace procedure test_sleep2(in n int) for debug
declare
  var i int; //
code
  i := 0; //
  while i < = n loop
    print("< < <  Proc 2 start (5 sec): " + dtoa(SYSDATE())); //
    sleep(5000); //
    print(" > > > Proc 2 stop  (5 sec): " + dtoa(SYSDATE())); //
    i := i + 1; //
  endloop; //
end;
Затем с помощью двух утилит inl (по возможности одновременно) выполняем следующие запросы:
- выполнить 20 циклов по 1 секунде:
execute test_sleep1(20);
- выполнить 4 цикла по 5 секунд:
execute test_sleep2(4);
Из протокола выполнения видно, что процедуры действительно «засыпают» и «просыпаются» через заданный промежуток времени.
2) Команда sleep полностью приравнена к select-запросу. Например, select-запрос,
 возвращающий 4 записи, будет 4 раза вызывать процедуру (с 5 секундной задержкой
 внутри), общее время выполнения запроса будет порядка 20 секунд, параллельно
 работающие запросы будут выполняться без задержек:
create or replace procedure killer2(in j int) result int
declare
  var i int; //
code
  sleep(5000); //
  i := j+100; //
  return i; //
end;

!4 rows, 4x5=20 sec:
select sysdate;
select killer2(personid), make from auto where personid <  5;
select sysdate;