Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle dbms_job.submit:Mischen von Synchron und Asynchron

Der einfachste mögliche Ansatz wäre, den l_job zu nehmen Ausgabeparameter von dbms_job.submit und schreiben Sie dann eine Schleife, die überprüft, wie viele dieser job Werte befinden sich in dba_jobs , wird beendet, wenn der Zähler 0 ist, und ansonsten über einen Aufruf von dbms_lock.sleep in den Ruhezustand versetzt für einen angemessenen Zeitraum. Natürlich müssen Sie vermeiden, den aktuellen l_job zu überschreiben Variable, um alle fünf Jobs zu erfassen. So etwas wie

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;

Jetzt könnten Sie natürlich die refresh_Independent_MViews ändern Prozedur, um die Sammlung von Jobnummern zurückzugeben, die überwacht werden müssen, damit die refresh_all_mviews Prozedur ruft refresh_independent_mviews auf , implementiert die Schleife und ruft dann refresh_dependent_mviews auf .

Sie könnten anspruchsvoller werden, indem Sie Ihre Jobs in eine Tabelle schreiben lassen, die Erfolg oder Misserfolg aufzeichnet, oder eine Nachricht über Oracle AQ senden, die ein anderer Prozess abhört, um die abhängige mview-Aktualisierung zu starten. Das ist in diesem Fall wahrscheinlich nicht erforderlich, könnte es aber sein, wenn Ihre Abhängigkeiten ausgefeilter werden. Zweifellos könnten Sie auch einen dbms_scheduler erstellen Kette, die das für Sie erledigen würde.