De eenvoudigst mogelijke benadering zou zijn om de l_job
uitvoerparameters van dbms_job.submit
en schrijf dan een lus die controleert hoeveel van die job
waarden staan in dba_jobs
, wordt afgesloten wanneer de telling 0 is en slaapt anders via een oproep naar dbms_lock.sleep
voor een redelijke termijn. Uiteraard moet u voorkomen dat u de huidige l_job
. overschrijft variabel om alle vijf banen vast te leggen. Iets als
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;
Nu zou je natuurlijk de refresh_Independent_MViews
. kunnen aanpassen procedure om de verzameling taaknummers te retourneren die moeten worden gecontroleerd, zodat de refresh_all_mviews
procedure roept refresh_independent_mviews
. aan , implementeert de lus en roept vervolgens refresh_dependent_mviews
. aan .
U kunt geavanceerder worden door uw taken naar een tabel te laten schrijven die succes of mislukking registreert, of door een bericht te verzenden via Oracle AQ waar een ander proces naar luistert om de afhankelijke mview-vernieuwing te starten. Dat is in dit geval waarschijnlijk niet nodig, maar misschien wel als uw afhankelijkheden geavanceerder worden. U kunt ongetwijfeld ook een dbms_scheduler
. maken ketting die dit voor u zou doen.