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.