Доступные версии документации

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

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

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

Описание

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

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

Примечание

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

Примеры
  1. С помощью утилиты 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;
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter