最も簡単なアプローチは、l_job
を取ることです。 dbms_job.submit
からの出力パラメーター 次に、それらのjob
の数をチェックするループを作成します。 値はdba_jobs
にあります 、カウントが0の場合に終了し、それ以外の場合はdbms_lock.sleep
の呼び出しを介してスリープします。 妥当な期間。明らかに、現在のl_job
を上書きしないようにする必要があります。 5つのジョブすべてをキャプチャするための変数。のようなもの
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
を呼び出します 。
成功または失敗を記録するテーブルにジョブを書き込むか、依存するmviewの更新を開始するために、別のプロセスがリッスンするメッセージをOracle AQ経由で送信することで、より高度なものにすることができます。この場合、これはおそらく必要ありませんが、依存関係がより洗練された場合は必要になる可能性があります。間違いなく、dbms_scheduler
を作成することもできます。 あなたのためにこれを行うチェーン。