等待提交的作业在Oracle PL / SQL中完成?

时间:2011-01-04 23:51:15

标签: multithreading oracle plsql

我在PL / SQL中寻找相当于Java的thread.join()。即我想开始一些工作(线程),然后等待它们完成。

这在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 个答案:

答案 0 :(得分:10)

这是使用DBMS_SCHEDULER作业调度中的链来完成的。 Oracle Documentation有一些例子可以达到你想要的效果。基本上,您可以使用执行结构定义步骤,小部分代码。在您的示例中,您的第一步将是一个开始步骤(通常会进行初始化),然后您将有两个并行运行的步骤(jobno1和jobno2),然后是最后一步,一旦两个并行作业完成就会激活

答案 1 :(得分:5)

我喜欢Adam Hawkes使用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链可能就是你现在应该这样做的方式,但我只是为了完整性而添加我的答案。