Den enklest mulige fremgangsmåde ville være at tage l_job outputparametre fra dbms_job.submit og skriv derefter en loop, der kontrollerer, hvor mange af disse job værdier er i dba_jobs , afsluttes, når tallet er 0, og sover ellers via et opkald til dbms_lock.sleep i et rimeligt tidsrum. Det er klart, at du skal undgå at overskrive den aktuelle l_job variabel for at fange alle fem job. Noget lignende
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 kunne du åbenbart ændre refresh_Independent_MViews procedure for at returnere samlingen af jobnumre, der skal overvåges, så refresh_all_mviews procedure kalder refresh_independent_mviews , implementerer løkken og kalder derefter refresh_dependent_mviews .
Du kan blive mere sofistikeret ved at få dine job til at skrive til en tabel, der registrerer succes eller fiasko, eller sende en besked via Oracle AQ, som en anden proces lytter til for at sætte gang i den afhængige mview-opdatering. Det er sandsynligvis ikke nødvendigt i dette tilfælde, men det kan være, hvis dine afhængigheder bliver mere sofistikerede. Du kan uden tvivl også oprette en dbms_scheduler kæde, der ville gøre dette for dig.