最も簡単なアプローチは、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を作成することもできます。 あなたのためにこれを行うチェーン。