#oracle #oracle-apex #oracle19c
Вопрос:
Я пытаюсь получить все возможные запуски для всех планировщиков, которые у меня есть в базе данных.
Я пытаюсь выполнить запрос/коллекцию с переводом repeat_interval(dba_scheduler_jobs) в несколько строк за текущий месяц.
напр.:
job_name:"banana" repeat_interval:"FREQ=DAILY;BYHOUR=09,13;BYMINUTE=00;BYSECOND=0;" job_name:"potatoes" repeat_interval:"FREQ=DAILY;BYHOUR=10;BYMINUTE=10,20,30;BYSECOND=0;" job_name:"carots" repeat_interval:"FREQ=DAILY;BYTIME=001500;"
Для
"banana" ; "01-11-2021 09:00:00" "potatoes" ; "01-11-2021 10:10:00" "potatoes" ; "01-11-2021 10:20:00" "potatoes" ; "01-11-2021 10:30:00" "banana" ; "01-11-2021 13:00:00" "carots" ; "01-11-2021 15:00:00" "banana" ; "02-11-2021 09:00:00" "potatoes" ; "02-11-2021 10:10:00" "potatoes" ; "02-11-2021 10:20:00" "potatoes" ; "02-11-2021 10:30:00" "banana" ; "02-11-2021 13:00:00" "carots" ; "02-11-2021 15:00:00" "banana" ; "03-11-2021 09:00:00" "potatoes" ; "03-11-2021 10:10:00" "potatoes" ; "03-11-2021 10:20:00" "potatoes" ; "03-11-2021 10:30:00" "banana" ; "03-11-2021 13:00:00" "carots" ; "03-11-2021 15:00:00" "banana" ; "04-11-2021 09:00:00" "potatoes" ; "04-11-2021 10:10:00" "potatoes" ; "04-11-2021 10:20:00" "potatoes" ; "04-11-2021 10:30:00" "banana" ; "04-11-2021 13:00:00" "carots" ; "04-11-2021 15:00:00" ... "banana" ; "30-11-2021 09:00:00" "potatoes" ; "30-11-2021 10:10:00" "potatoes" ; "30-11-2021 10:20:00" "potatoes" ; "30-11-2021 10:30:00" "banana" ; "30-11-2021 13:00:00" "carots" ; "30-11-2021 15:00:00"
Я уже нашел процедуру dbms_scheduler.evaluate_calendar_string, которая дает мне дату, но мне нужно будет выполнить какой-то цикл по часам-gt;минутам — gt;gt;секундам, я думаю?
Если бы кто-нибудь мог мне в этом помочь, я был бы благодарен.
С уважением, Дэвид
Комментарии:
1. Что ты пробовал? Запуск
dbms_scheduler.evaluate_calendar_string
в цикле — это не проблема.
Ответ №1:
В чем твоя проблема? Должно просто работать:
DECLARE start_time TIMESTAMP := TIMESTAMP '2021-11-01 00:00:00'; end_time TIMESTAMP := TIMESTAMP '2021-12-01 00:00:00'; next_run_date TIMESTAMP := start_time; BEGIN LOOP DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=DAILY;BYHOUR=09,13;BYMINUTE=00;BYSECOND=0;', NULL, next_run_date, next_run_date); DBMS_OUTPUT.PUT_LINE('banana =gt; '|| TO_CHAR(next_run_date, 'dd-mm-yyyy hh24:mi:ss') ); EXIT WHEN next_run_date gt;= end_time; END LOOP; END; banana =gt; 01-11-2021 09:00:00 banana =gt; 01-11-2021 13:00:00 banana =gt; 02-11-2021 09:00:00 banana =gt; 02-11-2021 13:00:00 banana =gt; 03-11-2021 09:00:00 banana =gt; 03-11-2021 13:00:00 banana =gt; 04-11-2021 09:00:00 ... banana =gt; 28-11-2021 09:00:00 banana =gt; 28-11-2021 13:00:00 banana =gt; 29-11-2021 09:00:00 banana =gt; 29-11-2021 13:00:00 banana =gt; 30-11-2021 09:00:00 banana =gt; 30-11-2021 13:00:00 banana =gt; 01-12-2021 09:00:00
Ответ №2:
Для фактического выбора оберните dbms_scheduler.evaluate_calendar_string
функцию таблицы.
CREATE TYPE t_schedule_row AS OBJECT ( id NUMBER, job_run_ts TIMESTAMP ); / CREATE TYPE t_schedule_tab IS TABLE OF t_schedule_row; / CREATE OR REPLACE FUNCTION schedule_ts_tf (start_date_i IN TIMESTAMP ,end_date_i IN TIMESTAMP ,interval_i IN VARCHAR2 ) RETURN t_schedule_tab AS l_tab t_schedule_tab := t_schedule_tab(); l_start_date TIMESTAMP; l_return_date_after TIMESTAMP; l_next_run_date TIMESTAMP; l_counter NUMBER; BEGIN -- start date of schedule l_counter := 1; l_start_date := start_date_i; l_return_date_after := start_date_i; LOOP dbms_scheduler.evaluate_calendar_string( interval_i, l_start_date, l_return_date_after, l_next_run_date); l_tab.extend; l_tab(l_tab.last) := t_schedule_row(l_counter, l_next_run_date); l_return_date_after := l_next_run_date; l_counter := l_counter 1; EXIT WHEN l_return_date_after gt; end_date_i; END LOOP; RETURN l_tab; END; / SELECT id, TO_CHAR(job_run_ts,'DD-MON-YYYY HH24:MI') FROM schedule_ts_tf (start_date_i =gt; TIMESTAMP '2021-11-01 00:00:00', end_date_i =gt; TIMESTAMP '2021-11-02 00:00:00', interval_i =gt; 'FREQ=DAILY;BYHOUR=09,13;BYMINUTE=00;BYSECOND=0;'); ID TO_CHAR(JOB_RUN_TS,'DD-MON ---------- -------------------------- 1 01-NOV-2021 09:00 2 01-NOV-2021 13:00 3 02-NOV-2021 09:00