Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle dbms_job.submit:Смесване на синхронно и асинхронно

Най-простият възможен подход би бил да вземете l_job изходни параметри от dbms_job.submit и след това напишете цикъл, който проверява колко от тези job стойностите са в dba_jobs , излиза, когато броячът е 0, и в противен случай заспива чрез извикване на dbms_lock.sleep за разумен период от време. Очевидно трябва да избягвате презаписването на текущата l_job променлива, за да обхване всичките пет работни места. Нещо като

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;

Сега очевидно можете да промените refresh_Independent_MViews процедура за връщане на колекцията от номера на задачи, които трябва да бъдат наблюдавани, така че refresh_all_mviews процедура извиква refresh_independent_mviews , прилага цикъла и след това извиква refresh_dependent_mviews .

Бихте могли да станете по-сложни, като накарате задачите си да пишат в таблица, която записва успех или неуспех, или като изпратите съобщение чрез Oracle AQ, което друг процес слуша, за да започне зависимо опресняване на mview. Това вероятно не е необходимо в този случай, но може да е, ако зависимостите ви станат по-сложни. Несъмнено можете да създадете и dbms_scheduler верига, която би направила това вместо вас.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как клаузата „in“ работи в oracle

  2. Опитвам се да внедря приложението Oracle-ADF на Tomcat 7

  3. Как да използвам Hibernate Session.doWork(...) за точки за запис/вложени транзакции?

  4. Как да настроите региона на часовата зона за JDBC Connection и да избегнете SqlException регионът на часовата зона не е намерен?

  5. HikariCP пропуска Oracle потребителски тип