oracle – 在PL / SQL中并行化调用

前端之家收集整理的这篇文章主要介绍了oracle – 在PL / SQL中并行化调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含proc的包,它将执行许多其他过程,如下所示:
  1. CREATE PACKAGE BODY pkg IS
  2. CREATE PROCEDURE do
  3. IS
  4. BEGIN
  5. other_pkg.other_proc;
  6. other_pkg2.other_proc2;
  7. other_pkg3.other_proc3;
  8. END;
  9. END;

有没有办法让程序并行而不是串行执行?

编辑:

这是在这个实例中使用DBMS_SCHEDULER的正确方法

  1. CREATE PACKAGE BODY pkg IS
  2. CREATE PROCEDURE do
  3. IS
  4. BEGIN
  5. DBMS_SCHEDULER.CREATE_JOB('job_other_pkg.other_proc','STORED_PROCEDURE','other_pkg.other_proc;');
  6. DBMS_SCHEDULER.RUN_JOB('job_other_pkg.other_proc',FALSE);
  7. -- ...
  8. END;
  9. END;
您可以使用dbms_job(或dbms_scheduler)包来提交将并行运行的作业.如果您使用的是dbms_job,则提交作业将成为事务的一部分,因此一旦事务完成,作业就会启动.
  1. CREATE PACKAGE BODY pkg IS
  2. CREATE PROCEDURE do
  3. IS
  4. l_jobno pls_integer;
  5. BEGIN
  6. dbms_job.submit(l_jobno,'begin other_pkg.other_proc; end;' );
  7. dbms_job.submit(l_jobno,'begin other_pkg2.other_proc2; end;' );
  8. dbms_job.submit(l_jobno,'begin other_pkg3.other_proc3; end;' );
  9. END;
  10. END;

如果您使用的是dbms_scheduler,则创建新作业不是事务性的(即每次创建新作业时都会进行隐式提交),如果在事务中执行其他工作时调用此过程,则可能会导致事务完整性出现问题.另一方面,如果您正在使用dbms_scheduler,则可能更容易提前创建作业并简单地从过程中运行它们(或使用dbms_scheduler创建一个链来运行作业以响应其他一些操作或事件,例如将消息放入队列中).

当然,无论使用哪种解决方案,您都需要构建基础架构来监控这三个作业的进度,假设您关心何时以及它们是否成功(以及它们是否会产生错误).

如果您打算使用DBMS_SCHEDULER

>无需使用动态sql.你可以放弃EXECUTE IMMEDIATE,直接调用DBMS_SCHEDULER包的程序就像你做任何其他程序一样.
>调用RUN_JOB时,需要传入第二个参数. use_current_session参数控制作业是在当前会话(和块)中运行还是在单独的会话中运行(在这种情况下,当前会话可以继续并执行其他操作).由于您希望并行运行多个作业,因此需要传入false值.
>虽然不是必需的,但创建作业一次(auto_drop设置为false)然后从您的过程中运行它们会更常规.

所以你可能想要在包外创建工作,然后你的程序就会变成

  1. CREATE PACKAGE BODY pkg IS
  2. CREATE PROCEDURE do
  3. IS
  4. BEGIN
  5. DBMS_SCHEDULER.RUN_JOB('job_other_pkg.other_proc',false);
  6. DBMS_SCHEDULER.RUN_JOB('job_other_pkg2.other_proc2',false);
  7. DBMS_SCHEDULER.RUN_JOB('job_other_pkg3.other_proc3',false);
  8. END;
  9. END;

猜你在找的Oracle相关文章