sql >> Database >  >> RDS >> Oracle

Oracle dbms_job.submit:Synchrone en asynchroon mixen

De eenvoudigst mogelijke benadering zou zijn om de l_job uitvoerparameters van dbms_job.submit en schrijf dan een lus die controleert hoeveel van die job waarden staan ​​in dba_jobs , wordt afgesloten wanneer de telling 0 is en slaapt anders via een oproep naar dbms_lock.sleep voor een redelijke termijn. Uiteraard moet u voorkomen dat u de huidige l_job . overschrijft variabel om alle vijf banen vast te leggen. Iets als

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;

Nu zou je natuurlijk de refresh_Independent_MViews . kunnen aanpassen procedure om de verzameling taaknummers te retourneren die moeten worden gecontroleerd, zodat de refresh_all_mviews procedure roept refresh_independent_mviews . aan , implementeert de lus en roept vervolgens refresh_dependent_mviews . aan .

U kunt geavanceerder worden door uw taken naar een tabel te laten schrijven die succes of mislukking registreert, of door een bericht te verzenden via Oracle AQ waar een ander proces naar luistert om de afhankelijke mview-vernieuwing te starten. Dat is in dit geval waarschijnlijk niet nodig, maar misschien wel als uw afhankelijkheden geavanceerder worden. U kunt ongetwijfeld ook een dbms_scheduler . maken ketting die dit voor u zou doen.



  1. Postgres pg_try_advisory_lock blokkeert alle records

  2. Hoe te bestellen op draaitabelgegevens in Eloquent ORM van Laravel

  3. MySQL kapt aaneengeschakeld resultaat van een GROUP_CONCAT-functie af

  4. Oracle pivot-operator