ТЗ:
На основании таблицы PROCESS_REQUIREMENTS, необходимо сделать функцию, которая будет возвращать ID контейнера, который должен быть сейчас запущен.
Для выбора процесса необходимо проверять:
1.отработавшие процессы не должны попадать в список запущенных (кроме многоразовых процессов, например:e16, ocr, odb
2.Выбирается самый ранний процесс по времени ко времени проверки, который еще не был запущен.
DoD Написана функция без параметров
PROCESS_REQUIREMENTS:
prc_session содержит в себе контейнеры, которые были запущенны в определенный промежуток времени
пункт 2 я выполнил написав:
spoilerCREATE OR REPLACE FUNCTION SV_ASU.asu_next_con
RETURN NUMBER
is
next_con NUMBER(20,0);
begin
with temp as
(
select distinct
pr.container_id as container_id
, end_time
, count(container_id) as c
from
main.prc_session ps
full join SV_ASU.PROCESS_REQUIREMENTS pr on pr.container_id = ps.PROCESS_ID
where
ps.start_time between to_date ('16/06/2022 0:00:00', 'dd/mm/yy hh24:mi:ss') and to_date ('16/06/2022 19:59:00', 'dd/mm/yy hh24:mi:ss') --тут будет за сегодняшнюю дату
and pr.container_id is not null
and ps.parent_id is null
group by pr.container_id
, end_time
--, count(container_id)
order by end_time desc
FETCH NEXT 1 ROWS ONLY
) --последний отработавший контейнер
select
lead(pr.container_id, 1) over (order by pr.execution_order) as nv --следующий контейнер от последнего отработавшего контейнера
into next_con
from
temp
full join
SV_ASU.PROCESS_REQUIREMENTS pr on pr.container_id = temp.container_id
order by
temp.container_id asc
FETCH NEXT 1 ROWS ONLY;
return next_con;
end asu_next_con;
/
теперь необходимо как-то воткнуть условие пункта 1 (некоторые контейнеры могут запускаться <=2 раза - это контейнеры 50000029, 70000019, 70000020)
пытался реализовать что-то типа этого (пронумеровать отработавшие контейнеры за определенный промежуток времени и далее с помощью декода, кейса их по определенным правилам отображать), но определенно это делаю неправильно:
spoiler with temp as
(
select distinct
pr.container_id as container_id
, ps.start_time
, end_time
, rank() over (partition by pr.container_id order by ps.start_time) as rn
from
main.prc_session ps
full join SV_ASU.PROCESS_REQUIREMENTS pr on pr.container_id = ps.PROCESS_ID
where
ps.start_time between to_date ('16/06/2022 0:00:00', 'dd/mm/yy hh24:mi:ss') and to_date ('16/06/2022 19:59:00', 'dd/mm/yy hh24:mi:ss') --тут будет за сегодняшнюю дату
and pr.container_id is not null
and ps.parent_id is null
order by end_time desc
FETCH NEXT 1 ROWS ONLY
) --последний отработавший контейнер
select /* decode (pr.container_id, 50000029 and temp.rn <= 2, 50000029, lead(pr.container_id, 1) over (order by pr.execution_order),
70000019 and temp.rn <= 2, 70000019, lead(pr.container_id, 1) over (order by pr.execution_order),
70000020 and temp.rn <= 2, 70000020,
pr.container_id and temp.rn < 2, lead(pr.container_id, 1) over (order by pr.execution_order), null) nv*/
case pr.container_id
when 50000029 and temp.rn <= 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
when 70000019 and temp.rn <= 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
when 70000020 and temp.rn <= 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
when pr.container_id and temp.rn < 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
else null
end as nv
-- lead(pr.container_id, 1) over (order by pr.execution_order) as nv --следующий контейнер от последнего отработавшего контейнера
, temp.start_time
from
temp
full join
SV_ASU.PROCESS_REQUIREMENTS pr on pr.container_id = temp.container_id
order by
temp.container_id asc
FETCH NEXT 1 ROWS ONLY;