Pendekatan paling sederhana yang mungkin adalah mengambil l_job
parameter keluaran dari dbms_job.submit
dan kemudian tulis loop yang memeriksa berapa banyak job
itu nilai ada di dba_jobs
, keluar saat hitungannya 0, dan sebaliknya tidur melalui panggilan ke dbms_lock.sleep
untuk jangka waktu yang wajar. Jelas, Anda harus menghindari menimpa l_job
saat ini variabel untuk menangkap semua lima pekerjaan. Sesuatu seperti
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;
Sekarang, Anda jelas dapat memodifikasi refresh_Independent_MViews
prosedur untuk mengembalikan kumpulan nomor pekerjaan yang perlu dipantau agar refresh_all_mviews
prosedur memanggil refresh_independent_mviews
, mengimplementasikan loop, lalu memanggil refresh_dependent_mviews
.
Anda bisa menjadi lebih canggih dengan meminta pekerjaan Anda menulis ke tabel yang mencatat keberhasilan atau kegagalan atau mengirim pesan melalui Oracle AQ yang didengarkan oleh proses lain untuk memulai penyegaran mview dependen. Itu mungkin tidak diperlukan dalam kasus ini tetapi mungkin jika dependensi Anda menjadi lebih canggih. Tidak diragukan lagi, Anda juga dapat membuat dbms_scheduler
rantai yang akan melakukan ini untuk Anda.