Oracle 我们可以在PL/SQL中使用线程吗?

Oracle 我们可以在PL/SQL中使用线程吗?,oracle,asynchronous,plsql,Oracle,Asynchronous,Plsql,PL/SQL中是否有异步调用的特性? 假设我在一个代码块中,想多次调用一个过程,而不想麻烦这个过程何时返回,返回什么 BEGIN myProc(1,100); myProc(101,200); myProc(201,300); ... ... END; 在上述情况下,我不希望代码在执行(101200)之前等待myProc(1100)完成处理 谢谢。您可能需要查看DBMS\u调度程序 为完整性而编辑: Oracle 10g上提供了DMBS_调度程序。对于在此之前的版本,DB

PL/SQL中是否有异步调用的特性? 假设我在一个代码块中,想多次调用一个过程,而不想麻烦这个过程何时返回,返回什么

BEGIN
  myProc(1,100);
  myProc(101,200);
  myProc(201,300);
  ...
  ...

END;
在上述情况下,我不希望代码在执行(101200)之前等待myProc(1100)完成处理

谢谢。

您可能需要查看DBMS\u调度程序

为完整性而编辑:

Oracle 10g上提供了DMBS_调度程序。对于在此之前的版本,DBMS_作业执行大致相同的任务


有关更多信息,请参阅:

您可能需要查看DBMS\u调度程序

为完整性而编辑:

Oracle 10g上提供了DMBS_调度程序。对于在此之前的版本,DBMS_作业执行大致相同的任务


有关更多信息,请参见:

在DBMS\u作业中提交,如下所示:

declare
  ln_dummy number;
begin
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;');
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;');
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;');
  COMMIT;
end;
您需要将job_queue_processs参数设置为>0,以生成线程来处理作业。您可以通过检查查看用户作业来查询作业

请注意,这适用于Oracle 9i,但不确定10g有哪些支持。查看更多信息


编辑:添加未提交的提交

在DBMS_作业中提交,如下所示:

declare
  ln_dummy number;
begin
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;');
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;');
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;');
  COMMIT;
end;
您需要将job_queue_processs参数设置为>0,以生成线程来处理作业。您可以通过检查查看用户作业来查询作业

请注意,这适用于Oracle 9i,但不确定10g有哪些支持。查看更多信息


<>编辑:添加了DMSMyTo调器和DbMSLJOB方法的遗漏提交

< P> + 1,但也考虑是否应该使用不同的方法。

如果您有一个以逐行方式执行的过程,并且您发现它很慢,那么答案可能不是同时多次运行该过程,而是确保使用基于集合的aproach。在极端情况下,您甚至可以使用并行查询和并行DML来减少进程的挂钟时间


我提到这只是因为这是一个非常常见的错误。>p>+ 1,对于dbMSyToaServer和DbMSyJOB方法,还考虑是否应该使用不同的方法。

如果您有一个以逐行方式执行的过程,并且您发现它很慢,那么答案可能不是同时多次运行该过程,而是确保使用基于集合的aproach。在极端情况下,您甚至可以使用并行查询和并行DML来减少进程的挂钟时间


我之所以提到这一点,只是因为这是一个非常常见的故障。

这里解释了将数据卸载到平面文件的不同方法。其中一种方法显示了如何使用PL/SQL并行执行以加快速度


这里解释了将数据卸载到平面文件的不同方法。其中一种方法显示了如何使用PL/SQL并行执行以加快速度


这里显示了执行并行(多线程)PL/SQL的另一种方法:

使用dbms_作业或dbms_调度的缺点是,您不知道任务何时完成。我读到你不介意,但也许你将来会改变主意

编辑:


本文描述了另一种方法。它使用
dbms\u作业
dbms\u警报
。警报用于发出作业已完成的信号(回调信号)

执行并行(多线程)PL/SQL的另一种方法如下所示:

使用dbms_作业或dbms_调度的缺点是,您不知道任务何时完成。我读到你不介意,但也许你将来会改变主意

编辑:


本文描述了另一种方法。它使用
dbms\u作业
dbms\u警报
。警报用于发出作业已完成的信号(回调信号)

您考虑过使用Oracle高级队列吗?

您考虑过使用Oracle高级队列吗?

对于PL/SQL并行处理,您有以下选项:

这些将使您能够“模拟”PL/SQL中的分叉和线程。当然,使用这些,您可能会意识到需要在并行执行的过程之间进行通信。要执行此操作,请查看:


我个人使用DBMS_调度器实现了一个并行处理系统,并使用DBMS_管道在“线程”之间进行通信。我对两者的结合感到非常高兴,我的主要目标(通过一个特别的重量级程序减少主要的处理时间)实现了

对于PL/SQL并行处理,您有以下选项:

这些将使您能够“模拟”PL/SQL中的分叉和线程。当然,使用这些,您可能会意识到需要在并行执行的过程之间进行通信。要执行此操作,请查看:


我个人使用DBMS_调度器实现了一个并行处理系统,并使用DBMS_管道在“线程”之间进行通信。我对两者的结合感到非常高兴,我的主要目标(通过一个特别的重量级程序减少主要的处理时间)实现了

askTom在此列出的并行流水线方法提供了一种更复杂的方法,但实际上,与DBMS作业技术不同,您将暂停工作直到工作完成。也就是说,您确实要求使用“异步”技术,而DBMS_作业正是这方面的完美之选。

askTom在此列出的并行流水线方法提供了一种更复杂的方法,但您实际上会暂停,直到工作完成,这与DBMS作业技术不同。也就是说,您确实要求使用“异步”技术,而DBMS_工作正是这方面的完美选择。

您确实有另一个选择,从11g开始。Oracle引入了一个包,它的功能与您想要的类似,名为DBMS_PARALLEL_EXECUTE

<