Det enklaste möjliga tillvägagångssättet skulle vara att ta l_job
utdataparametrar från dbms_job.submit
och skriv sedan en slinga som kontrollerar hur många av dessa job
värden finns i dba_jobs
, avslutas när antalet är 0, och annars sover via ett samtal till dbms_lock.sleep
under en rimlig tid. Självklart måste du undvika att skriva över det nuvarande l_job
variabel för att fånga alla fem jobben. Något liknande
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 kan du uppenbarligen ändra refresh_Independent_MViews
procedur för att returnera samlingen av jobbnummer som behöver övervakas så att refresh_all_mviews
proceduren anropar refresh_independent_mviews
, implementerar slingan och anropar sedan refresh_dependent_mviews
.
Du kan bli mer sofistikerad genom att låta dina jobb skriva till en tabell som registrerar framgång eller misslyckande eller skicka ett meddelande via Oracle AQ som en annan process lyssnar på för att starta den beroende mview-uppdateringen. Det behövs förmodligen inte i det här fallet, men det kan vara om dina beroenden blir mer sofistikerade. Utan tvekan kan du också skapa en dbms_scheduler
kedja som skulle göra detta åt dig.