sql >> データベース >  >> RDS >> Oracle

Oracle dbms_job.submit:同期と非同期の混合

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



    1. 巨大な(95Mb)JSON配列を小さなチャンクに分割しますか?

    2. MySQLでアクセントを削除する方法は?

    3. (グループ内の)重複エントリを検索するSQL

    4. スペースmysqlでテーブルの名前を変更します