Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle dbms_job.submit:miscelazione sincrona e asincrona

L'approccio più semplice possibile sarebbe quello di prendere l_job parametri di output da dbms_job.submit e poi scrivi un ciclo che controlli quanti di quei job i valori sono in dba_jobs , esce quando il conteggio è 0, altrimenti dorme tramite una chiamata a dbms_lock.sleep per un periodo di tempo ragionevole. Ovviamente, dovresti evitare di sovrascrivere l'attuale l_job variabile per acquisire tutti e cinque i lavori. Qualcosa come

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;

Ora puoi ovviamente modificare refresh_Independent_MViews procedura per restituire la raccolta dei numeri di lavoro che devono essere monitorati in modo che refresh_all_mviews chiamate di procedura refresh_independent_mviews , implementa il ciclo, quindi chiama refresh_dependent_mviews .

Potresti diventare più sofisticato facendo scrivere i tuoi lavori su una tabella che registra l'esito positivo o negativo o inviando un messaggio tramite Oracle AQ che un altro processo ascolta per avviare l'aggiornamento dipendente di mview. Probabilmente non è necessario in questo caso, ma potrebbe esserlo se le tue dipendenze diventano più sofisticate. Senza dubbio, potresti anche creare un dbms_scheduler catena che farebbe questo per te.