Nejjednodušším možným přístupem by bylo vzít l_job
výstupní parametry z dbms_job.submit
a poté napište smyčku, která zkontroluje, kolik z těchto job
hodnoty jsou v dba_jobs
, ukončí se, když je počet 0, a jinak přejde do režimu spánku prostřednictvím volání dbms_lock.sleep
po přiměřenou dobu. Je zřejmé, že byste se měli vyhnout přepsání aktuálního l_job
proměnnou, aby bylo možné zachytit všech pět úloh. Něco jako
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;
Nyní byste samozřejmě mohli upravit refresh_Independent_MViews
postup pro vrácení kolekce čísel úloh, která je třeba monitorovat, aby refresh_all_mviews
procedura volá refresh_independent_mviews
, implementuje smyčku a poté zavolá refresh_dependent_mviews
.
Můžete být sofistikovanější, pokud necháte své úlohy zapisovat do tabulky, která zaznamenává úspěch nebo neúspěch, nebo odešlete zprávu přes Oracle AQ, kterou poslouchá jiný proces, aby se spustilo závislé obnovení mview. V tomto případě to pravděpodobně není potřeba, ale může být, pokud budou vaše závislosti sofistikovanější. Nepochybně můžete také vytvořit dbms_scheduler
řetězec, který by to udělal za vás.