Най-простият възможен подход би бил да вземете l_job
изходни параметри от dbms_job.submit
и след това напишете цикъл, който проверява колко от тези job
стойностите са в dba_jobs
, излиза, когато броячът е 0, и в противен случай заспива чрез извикване на dbms_lock.sleep
за разумен период от време. Очевидно трябва да избягвате презаписването на текущата l_job
променлива, за да обхване всичките пет работни места. Нещо като
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;
Сега очевидно можете да промените refresh_Independent_MViews
процедура за връщане на колекцията от номера на задачи, които трябва да бъдат наблюдавани, така че refresh_all_mviews
процедура извиква refresh_independent_mviews
, прилага цикъла и след това извиква refresh_dependent_mviews
.
Бихте могли да станете по-сложни, като накарате задачите си да пишат в таблица, която записва успех или неуспех, или като изпратите съобщение чрез Oracle AQ, което друг процес слуша, за да започне зависимо опресняване на mview. Това вероятно не е необходимо в този случай, но може да е, ако зависимостите ви станат по-сложни. Несъмнено можете да създадете и dbms_scheduler
верига, която би направила това вместо вас.