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

vic*_*csz 4 oracle multithreading 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;
Run Code Online (Sandbox Code Playgroud)

Ada*_*kes 10

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


Mik*_*ers 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链可能就是你现在应该这样做的方式,但我只想添加完整性的答案.