Najprostszym możliwym podejściem byłoby wzięcie l_job
parametry wyjściowe z dbms_job.submit
a następnie napisz pętlę, która sprawdza, ile z tych job
wartości są w dba_jobs
, kończy działanie, gdy licznik wynosi 0, w przeciwnym razie zasypia przez wywołanie dbms_lock.sleep
przez rozsądny okres czasu. Oczywiście musisz uniknąć nadpisywania bieżącego l_job
zmienna w celu przechwycenia wszystkich pięciu zadań. Coś jak
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;
Teraz możesz oczywiście zmodyfikować refresh_Independent_MViews
procedura zwracania kolekcji numerów zadań, które mają być monitorowane, tak aby refresh_all_mviews
wywołania procedur refresh_independent_mviews
, implementuje pętlę, a następnie wywołuje refresh_dependent_mviews
.
Możesz stać się bardziej wyrafinowany, gdy zadania zapisują się do tabeli, która rejestruje sukces lub niepowodzenie, lub wysyła wiadomość za pośrednictwem Oracle AQ, której nasłuchuje inny proces w celu rozpoczęcia zależnego odświeżenia mview. Prawdopodobnie nie jest to potrzebne w tym przypadku, ale może być, jeśli twoje zależności staną się bardziej wyrafinowane. Niewątpliwie możesz również utworzyć dbms_scheduler
łańcuch, który zrobi to za Ciebie.