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