Der einfachste mögliche Ansatz wäre, den l_job
zu nehmen Ausgabeparameter von dbms_job.submit
und schreiben Sie dann eine Schleife, die überprüft, wie viele dieser job
Werte befinden sich in dba_jobs
, wird beendet, wenn der Zähler 0 ist, und ansonsten über einen Aufruf von dbms_lock.sleep
in den Ruhezustand versetzt für einen angemessenen Zeitraum. Natürlich müssen Sie vermeiden, den aktuellen l_job
zu überschreiben Variable, um alle fünf Jobs zu erfassen. So etwas wie
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;
Jetzt könnten Sie natürlich die refresh_Independent_MViews
ändern Prozedur, um die Sammlung von Jobnummern zurückzugeben, die überwacht werden müssen, damit die refresh_all_mviews
Prozedur ruft refresh_independent_mviews
auf , implementiert die Schleife und ruft dann refresh_dependent_mviews
auf .
Sie könnten anspruchsvoller werden, indem Sie Ihre Jobs in eine Tabelle schreiben lassen, die Erfolg oder Misserfolg aufzeichnet, oder eine Nachricht über Oracle AQ senden, die ein anderer Prozess abhört, um die abhängige mview-Aktualisierung zu starten. Das ist in diesem Fall wahrscheinlich nicht erforderlich, könnte es aber sein, wenn Ihre Abhängigkeiten ausgefeilter werden. Zweifellos könnten Sie auch einen dbms_scheduler
erstellen Kette, die das für Sie erledigen würde.