Приостанов выполнения процедуры
Синтаксис
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;