L'approccio più semplice possibile sarebbe quello di prendere l_job
parametri di output da dbms_job.submit
e poi scrivi un ciclo che controlli quanti di quei job
i valori sono in dba_jobs
, esce quando il conteggio è 0, altrimenti dorme tramite una chiamata a dbms_lock.sleep
per un periodo di tempo ragionevole. Ovviamente, dovresti evitare di sovrascrivere l'attuale l_job
variabile per acquisire tutti e cinque i lavori. Qualcosa come
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;
Ora puoi ovviamente modificare refresh_Independent_MViews
procedura per restituire la raccolta dei numeri di lavoro che devono essere monitorati in modo che refresh_all_mviews
chiamate di procedura refresh_independent_mviews
, implementa il ciclo, quindi chiama refresh_dependent_mviews
.
Potresti diventare più sofisticato facendo scrivere i tuoi lavori su una tabella che registra l'esito positivo o negativo o inviando un messaggio tramite Oracle AQ che un altro processo ascolta per avviare l'aggiornamento dipendente di mview. Probabilmente non è necessario in questo caso, ma potrebbe esserlo se le tue dipendenze diventano più sofisticate. Senza dubbio, potresti anche creare un dbms_scheduler
catena che farebbe questo per te.