Oracle Таблица заданий вместе с DBMS_SCHEDULER.create_job - PullRequest
0 голосов
/ 27 апреля 2020

Env: Oracle 12 c

У меня есть таблица с именем JOB_TABLE , которая имеет следующие значения:

ID     JOB_ID   DATA2    STATUS
------ -------- -------- -------
1      100      AAA      NEW
2      100      BBB      NEW
3      100      CCC      NEW

Используя этот JOB_TABLE, Мне нужно обработать все записи индивидуально на основе JOB_ID, переданного в вызов процедуры, это экземпляр, который будет 100

Теперь мне нужно l oop через каждую запись по порядку, снова один в время и передайте значение столбца JOB_DATA.DATA2 в другую подпрограмму, которая в конечном итоге обновит значение STATUS этой другой таблицы, называемой DATA_TABLE, либо PASS, либо FAIL

В этом случае: DATA_TABLE

ID     DATA2    STATUS
------ -------- -------
1      AAA      Pending

Поскольку я не знаю, когда будет обновлено значение STATUS этого DATA_TABLE (на основе REST API асинхронного ответа), я создал задание Oracle DBMS_SCHEDULER для выполнения SYSDATE + 5 секунд, как показано:

DBMS_SCHEDULER.create_job
    (job_name                  => in_job_name,
     job_type                  => 'PLSQL_BLOCK',
     job_action                => 'begin get_data_status; end;',
     number_of_arguments       => 0,
     start_date                => sysdate + NUMTODSINTERVAL(5, 'SECOND'),
     repeat_interval           => null,
     enabled                   => TRUE,
     auto_drop                 => TRUE
    );

JOB_ACTION вызывает другую процедуру PL / SQL с именем get_data_status, которая просто проверяет значение состояния для записи AAA.

if status = 'OK' then
  -->> I now want to go back to JOB_TABLE above and now process the next available record, i.e. `BBB` 
       and perform the same process above again for this record and so on, until no JOB_TABLE records 
       exist for JOB_ID: 100
elsif status = 'Pending' then
  -->> call DBMS_SCHEDULER process above again for same 'AAA' record and check DATA_TABLE.STATUS
else
  --> process ERROR
end if;

На основании вышеизложенного, Я не уверен, как go об обработке мой JOB_TABLE в последовательном порядке вместе с планировщиком, чтобы все мои задания для JOB_ID: 100 обрабатывались по отдельности.

Я не могу использовать FOR L OOP, так как не хочу переходить к Следующая работа, пока я не вернусь СОСТОЯНИЕ ОК в DATA_TABLE.

Любые идеи о том, как структурировать это, будут полезны.

...