powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Время работы джоба
12 сообщений из 12, страница 1 из 1
Время работы джоба
    #39856512
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Можно ли задать следующий интервал у ОДНОГО джоба:
Каждый день кроме выходных с 9 до 18 с интервалом 5 секунд?

Я пока только до двух додумался, но и то там есть вопросы.
...
Рейтинг: 0 / 0
Время работы джоба
    #39856516
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно конечно намутить INTERVAL, но ИМХО проще установить интервал 5 секунд, а уже в теле джоба проверять текущий день (выходной/рабочий) и время (рабочее/не рабочее)
...
Рейтинг: 0 / 0
Время работы джоба
    #39856517
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выходные с интервалом 5 секунд - это секунду работаю, четыре секунды выходной (по аналогии "сутки через трое")?
...
Рейтинг: 0 / 0
Время работы джоба
    #39856532
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SynopticМожно конечно намутить INTERVAL, но ИМХО проще установить интервал 5 секунд, а уже в теле джоба проверять текущий день (выходной/рабочий) и время (рабочее/не рабочее)
Да, тоже примерно об этом думал. Запустить навсегда с интервалом 5 секунд, а в функции уже контролировать дату и время выполнения логики.

-2-Выходные с интервалом 5 секунд - это секунду работаю, четыре секунды выходной (по аналогии "сутки через трое")?
Пн: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Вт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Ср: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Чт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Пт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Сб: 00:00-23:59 не выполняется
Вс: 00:00-23:59 не выполняется

Интервал 5 сек. Начало в 08:00:00.
Следующие вызовы: 08:00:00, 08:00:05, 08:00:10, 08:00:15, 08:00:20, 08:00:25, 08:00:30, 08:00:35, 08:00:40, 08:00:45 и т.д.

Так как функция выполняется 1сек (реально меньше), то фактически получается "секунду работаю, четыре секунды выходной".
...
Рейтинг: 0 / 0
Время работы джоба
    #39856536
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вариант, организовать в теле джоба бесконечный цикл и в теле сделать проверку текущего дня/времени, а в конце цикла задержку с помощью Dbms_Lock.sleep(5)
Тогда вообще не нужно думать над сложным интервалом.
...
Рейтинг: 0 / 0
Время работы джоба
    #39856547
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO,

выходной не обязательно суббота/воскресенье и наоборот

в древних версиях ф-ция имела параметр Next_Date IN OUT DATE (время следующего запуска), я б определял время запуска в ф-ции и возвращал его "субмиту"

зы
в соременной субд возможно надо юзать шедюлер с расписанием

.....
stax
...
Рейтинг: 0 / 0
Время работы джоба
    #39856548
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMNOSynopticМожно конечно намутить INTERVAL, но ИМХО проще установить интервал 5 секунд, а уже в теле джоба проверять текущий день (выходной/рабочий) и время (рабочее/не рабочее)
Да, тоже примерно об этом думал. Запустить навсегда с интервалом 5 секунд, а в функции уже контролировать дату и время выполнения логики.

-2-Выходные с интервалом 5 секунд - это секунду работаю, четыре секунды выходной (по аналогии "сутки через трое")?
Пн: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Вт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Ср: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Чт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Пт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Сб: 00:00-23:59 не выполняется
Вс: 00:00-23:59 не выполняется

Интервал 5 сек. Начало в 08:00:00.
Следующие вызовы: 08:00:00, 08:00:05, 08:00:10, 08:00:15, 08:00:20, 08:00:25, 08:00:30, 08:00:35, 08:00:40, 08:00:45 и т.д.

Так как функция выполняется 1сек (реально меньше), то фактически получается "секунду работаю, четыре секунды выходной".
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
begin
  sys.dbms_scheduler.create_job(job_name            => 'MY_JOB',
                                job_type            => 'PLSQL_BLOCK',
                                job_action          => '',
                                start_date          => sysdate,
                                repeat_interval     => 'Freq=Secondly;Interval=5;ByDay=Mon, Tue, Wed, Thu, Fri;ByHour=08, 09, 10, 11, 12, 13, 14, 15, 16, 17',
                                end_date            => to_date(null),
                                job_class           => '',
                                enabled             => true,
                                auto_drop           => false,
                                comments            => '');
end;
/
...
Рейтинг: 0 / 0
Время работы джоба
    #39856563
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagor,

для случаев, когда доп.праздники, переносы, использовать доп. расписание рабочих/выходных дней через
Код: plsql
1.
2.
include_clause = "INCLUDE" "=" schedule_list
exclude_clause = "EXCLUDE" "=" schedule_list
...
Рейтинг: 0 / 0
Время работы джоба
    #39856565
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorfeagor,

для случаев, когда доп.праздники, переносы, использовать доп. расписание рабочих/выходных дней через
Код: plsql
1.
2.
include_clause = "INCLUDE" "=" schedule_list
exclude_clause = "EXCLUDE" "=" schedule_list



Ну учитывая рабочие, проще тогда уже сделать, как Synoptic предложил. Запускаем навсегда, но контролируем ифами в функции.

Всем спасибо.
...
Рейтинг: 0 / 0
Время работы джоба
    #39856584
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMNO,

судя по тому, что вы запускаете это каждые 5 секунд - предполагаю, что чекаете поступление каких-то данных и обрабатываете их.
В вашем случае возможно будет лучше использовать DBMS_AQ с запуском DEQUEUE по событию
...
Рейтинг: 0 / 0
Время работы джоба
    #39857949
mlader
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно, будет полезно. У меня была похожая задача, но мне нужно было менять время следующего запуска джоба в зависимости от условий, и заранее неизвестно, будет выполнено условие или нет.
В моём случае джоб звал процедуру, внутри процедуры проверялось условие.
Если условие выполнено, изменяется время следующего джоба на завтра. Если условие не выполнено, изменяется время следующего джоба на "через пять минут". С такой процедурой есть возможность навешивать сложные условия (не только буден/выходной) на время следующего выполнения джоба.

Для изменения времени джоба написал такую процедуру:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
create or replace procedure JOB_CHANGE(JOB_ID in NUMBER,
                                           JOB_COMMAND in VARCHAR2,
                                           JOB_NEXT_DATE in DATE,
                                           JOB_INTERVAL in VARCHAR2
                                           )
as
   --V типа variable. 
   V_JOB_COMMAND VARCHAR(400);
   V_JOB_NEXT_DATE DATE;
   V_JOB_INTERVAL VARCHAR(400);
   
   --R - типа "результат". Значение, которое подадим для изменения значения джоба.
   R_JOB_COMMAND VARCHAR(400);
   R_JOB_NEXT_DATE DATE;
   R_JOB_INTERVAL VARCHAR(400);
   
begin
  

  
   SELECT TO_CHAR(J.WHAT) INTO V_JOB_COMMAND FROM ALL_JOBS J WHERE J.JOB = JOB_ID;
   IF JOB_COMMAND IS NULL THEN
     R_JOB_COMMAND := V_JOB_COMMAND;
   ELSE
     R_JOB_COMMAND := JOB_COMMAND;
   END IF;
   
   SELECT J.NEXT_DATE INTO V_JOB_NEXT_DATE FROM ALL_JOBS J WHERE J.JOB = JOB_ID;
   IF V_JOB_NEXT_DATE IS NULL THEN
     R_JOB_NEXT_DATE := V_JOB_NEXT_DATE;
   ELSE
     R_JOB_NEXT_DATE := JOB_NEXT_DATE;
   END IF;   
   
   SELECT TO_CHAR(J.INTERVAL) INTO V_JOB_INTERVAL FROM ALL_JOBS J WHERE J.JOB = JOB_ID;
   IF JOB_INTERVAL IS NULL THEN
     R_JOB_INTERVAL := V_JOB_INTERVAL;
   ELSE
     R_JOB_INTERVAL := JOB_INTERVAL;
   END IF;

   sys.dbms_job.change(job => JOB_ID,
                       what => R_JOB_COMMAND,
                       next_date => R_JOB_NEXT_DATE,
                       interval => R_JOB_INTERVAL);
   commit;
end;
...
Рейтинг: 0 / 0
Время работы джоба
    #39857962
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ерундой не надо заниматься
Stax уже намекнул, что можно выставить врямя следующего запуска прямо в переменной NEXT_DATE
С DBMS_SCHEDULER это тоже работает

PS. Но по условию первоначальной задачи (безо всяких праздников) самый красивый/переносимый/правильный вариант таки от feagor 21962320
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Время работы джоба
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]