Ожидание завершения отправленной работы в Oracle PL / SQL? - PullRequest
4 голосов
/ 05 января 2011

Я ищу эквивалент thread.join () Java в PL / SQL.Т.е. я хочу запустить несколько заданий (потоков), а затем дождаться их завершения.

Как это возможно в PL / SQL?

Я думаю об использовании dbms_job.submit (я знаю, что это устарело).dbms_scheduler также является альтернативой.

Мой код:

DECLARE
  jobno1 number;
  jobno2 number;
BEGIN

  dbms_job.submit(jobno1,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 1 exit'');end;');
  dbms_job.submit(jobno2,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 2 exit'');end;');

  dbms_job.run(jobno1);
  dbms_job.run(jobno2);

  //Need code to Wait for jobno1 to finish
  //Need code to Wait for jobno2 to finish

END;

Ответы [ 2 ]

10 голосов
/ 05 января 2011

Это достигается с помощью цепочек в DBMS_SCHEDULER расписании заданий.Документация Oracle содержит примеры, которые выполняют то, что вы хотите.По сути, вы определяете шаги, небольшие части кода со структурой выполнения.В вашем примере вашим первым шагом будет начальный шаг (который обычно выполняется при инициализации), затем у вас будет два шага, которые выполняются параллельно (jobno1 и jobno2), а затем последний шаг, который активируется после завершения обоих параллельных заданий.

5 голосов
/ 05 января 2011

Мне нравится решение от Адама Хоукса, использующее цепочки DBMS_SCHEDULER.Не знал об этом, так как я все еще использую DBMS_JOB и еще не переписал код.

В любом случае ... решение, которое я сейчас использую для этого, представляет собой комбинацию DBMS_JOB (хотя вам, вероятно, следует использовать DBMS_SCHEDULER, посколькуDBMS_JOB устарела, как вы заметили) и DBMS_ALERT.

Задания создаются с использованием DBMS_JOB.Затем мы ждем завершения работ, используя dbms_alert.register и dbms_alert.waitany.Каждое задание после его завершения использует dbms_alert.signal.Может быть проблема, если работа завершается и сигнализирует о том, что родитель готов, но я уверен, что вы могли бы обойти это.

Я предполагаю, что цепочки DBMS_SCHEDULER, вероятно, именно так вы и должны сейчас поступить, но я просто добавляю мой ответ для полноты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...