A abordagem mais simples possível seria usar o
l_job
parâmetros de saída de dbms_job.submit
e, em seguida, escreva um loop que verifique quantos desses job
os valores estão em dba_jobs
, sai quando a contagem é 0 e, caso contrário, dorme por meio de uma chamada para dbms_lock.sleep
por um período de tempo razoável. Obviamente, você precisaria evitar sobrescrever o l_job
atual variável para capturar todos os cinco trabalhos. Algo como CREATE TYPE num_tbl
AS TABLE OF NUMBER;
PROCEDURE refresh_all_MViews AS
l_job BINARY_INTEGER;
l_jobs num_tbl;
BEGIN
l_jobs.extend(5);
dbms_job.submit (l_job, ...) ;
l_jobs(1) := l_job;
dbms_job.submit (l_job, ...) ;
l_jobs(2) := l_job;
dbms_job.submit (l_job, ...) ;
l_jobs(3) := l_job;
dbms_job.submit (l_job, ...) ;
l_jobs(4) := l_job;
dbms_job.submit (l_job, ...) ;
l_jobs(5) := l_job;
loop
select count(*)
into l_cnt
from dba_jobs
where job in (select column_value from table(l_jobs));
if( l_cnt = 0 )
then
exit;
end if;
dbms_lock.sleep( 10 ); -- Sleep for 10 seconds
end loop;
refresh_Dependent_MViews;
END refresh_all_MViews;
Agora, você obviamente pode modificar as
refresh_Independent_MViews
procedimento para retornar a coleção de números de trabalho que precisam ser monitorados para que o refresh_all_mviews
procedimento chama refresh_independent_mviews
, implementa o loop e chama refresh_dependent_mviews
. Você pode ficar mais sofisticado fazendo com que seus jobs gravem em uma tabela que registre sucesso ou falha ou enviando uma mensagem via Oracle AQ que outro processo escuta para iniciar a atualização do mview dependente. Isso provavelmente não é necessário neste caso, mas pode ser se suas dependências ficarem mais sofisticadas. Sem dúvida, você também pode criar um
dbms_scheduler
cadeia que faria isso por você.