sql >> Databáze >  >> RDS >> Oracle

Oracle dbms_job.submit:Míchání synchronního a asynchronního

Nejjednodušším možným přístupem by bylo vzít l_job výstupní parametry z dbms_job.submit a poté napište smyčku, která zkontroluje, kolik z těchto job hodnoty jsou v dba_jobs , ukončí se, když je počet 0, a jinak přejde do režimu spánku prostřednictvím volání dbms_lock.sleep po přiměřenou dobu. Je zřejmé, že byste se měli vyhnout přepsání aktuálního l_job proměnnou, aby bylo možné zachytit všech pět úloh. Něco jako

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;

Nyní byste samozřejmě mohli upravit refresh_Independent_MViews postup pro vrácení kolekce čísel úloh, která je třeba monitorovat, aby refresh_all_mviews procedura volá refresh_independent_mviews , implementuje smyčku a poté zavolá refresh_dependent_mviews .

Můžete být sofistikovanější, pokud necháte své úlohy zapisovat do tabulky, která zaznamenává úspěch nebo neúspěch, nebo odešlete zprávu přes Oracle AQ, kterou poslouchá jiný proces, aby se spustilo závislé obnovení mview. V tomto případě to pravděpodobně není potřeba, ale může být, pokud budou vaše závislosti sofistikovanější. Nepochybně můžete také vytvořit dbms_scheduler řetězec, který by to udělal za vás.



  1. Vyberte z tabulky, pokud je záznam nalezen v jiné tabulce

  2. Vypuštění sloupce v Postgresu na velké datové sadě

  3. Které kódy mají shodu v db

  4. Poskytovatel OLE DB Microsoft.ACE.OLEDB.12.0 pro propojený server (null) vrátil zprávu Záložka je neplatná.