Cách tiếp cận đơn giản nhất có thể là sử dụng l_job
tham số đầu ra từ dbms_job.submit
và sau đó viết một vòng lặp để kiểm tra xem có bao nhiêu job
đó các giá trị nằm trong dba_jobs
, thoát ra khi số đếm là 0 và nếu không sẽ ở chế độ ngủ thông qua lệnh gọi tới dbms_lock.sleep
trong một khoảng thời gian hợp lý. Rõ ràng, bạn cần tránh ghi đè l_job
hiện tại để nắm bắt tất cả năm công việc. Một cái gì đó giống như
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;
Bây giờ, rõ ràng bạn có thể sửa đổi refresh_Independent_MViews
thủ tục trả về tập hợp số công việc cần được theo dõi để refresh_all_mviews
lệnh gọi thủ tục refresh_independent_mviews
, triển khai vòng lặp, rồi gọi refresh_dependent_mviews
.
Bạn có thể trở nên phức tạp hơn bằng cách yêu cầu công việc của bạn ghi vào một bảng ghi lại thành công hay thất bại hoặc gửi một thông báo qua Oracle AQ mà một quy trình khác sẽ lắng nghe để bắt đầu làm mới mview phụ thuộc. Điều đó có thể không cần thiết trong trường hợp này nhưng có thể là nếu các phụ thuộc của bạn ngày càng phức tạp hơn. Không nghi ngờ gì nữa, bạn cũng có thể tạo dbms_scheduler
chuỗi sẽ làm điều này cho bạn.