Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle dbms_job.submit:Misturando Síncrono e Assíncrono


A abordagem mais simples possível seria usar o l_job parâmetros de saída de dbms_job.submit e, em seguida, escreva um loop que verifique quantos desses job os valores estão em dba_jobs , sai quando a contagem é 0 e, caso contrário, dorme por meio de uma chamada para dbms_lock.sleep por um período de tempo razoável. Obviamente, você precisaria evitar sobrescrever o l_job atual variável para capturar todos os cinco trabalhos. Algo como
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;

Agora, você obviamente pode modificar as refresh_Independent_MViews procedimento para retornar a coleção de números de trabalho que precisam ser monitorados para que o refresh_all_mviews procedimento chama refresh_independent_mviews , implementa o loop e chama refresh_dependent_mviews .

Você pode ficar mais sofisticado fazendo com que seus jobs gravem em uma tabela que registre sucesso ou falha ou enviando uma mensagem via Oracle AQ que outro processo escuta para iniciar a atualização do mview dependente. Isso provavelmente não é necessário neste caso, mas pode ser se suas dependências ficarem mais sofisticadas. Sem dúvida, você também pode criar um dbms_scheduler cadeia que faria isso por você.