在一个包中多次调用同一个 plsql 过程

Posted

技术标签:

【中文标题】在一个包中多次调用同一个 plsql 过程【英文标题】:Calling same plsql Procedure more than once in a package parallely 【发布时间】:2017-01-18 10:24:08 【问题描述】:

在调用的地方有一个 plsql 包“OMX_BEACON_MIG”

PROCEDURE handle_NR_Site(
    i_old_plan_inst_id NUMBER,
    i_new_plan_inst_id NUMBER,
    i_old_act_id       NUMBER,
    i_new_act_id       NUMBER )

要处理操作 ID,即,如果我有 4 个操作 ID,那么我将调用此过程 4 次,因为 " i_old_plan_inst_id" , "i_new_plan_inst_id","i_old_act_id","i_new_act_id" 对于每个操作都是不同的。

有什么解决方案可以让我只调用一次这个过程,所有 4 个动作都处理一次?

或者有没有办法并行调用这个函数而不是一个一个地调用? 请指导。

【问题讨论】:

您可以创建 4 个临时计划作业,但是如果您的代码需要在 4 个作业完成后继续,您需要编写一些监控代码来检查作业何时完成,并且您必须处理其中一个或多个失败的情况。或者,您可以查看 handle_nr_site 过程,看看是否有任何方法可以将其转换为同时处理多个操作。 【参考方案1】:

Oracle 有一个非常好的实用程序 dbms_scheduler 可以并行运行作业。您可以使用不同的参数调用以下函数四次以并行执行它们。

dbms_scheduler.create_job(job_name => dbms_scheduler.generate_job_name('MY_JOB_'),
   job_type => 'PLSQL_BLOCK',
   job_action => 'begin  handle_NR_Site(i_old_plan_inst_id => param1, i_new_plan_inst_id => param2, i_old_act_id => param3, i_new_act_id => param4 ); end;',
   comments => 'Thread 1 descriptionn',
   enabled => true,
   auto_drop => true);

作业将在后台运行。查询表DBA_SCHEDULER_JOB_RUN_DETAILS获取执行状态。

更详细的解释请查看链接: https://oracle-base.com/articles/10g/scheduler-10g

【讨论】:

以上是关于在一个包中多次调用同一个 plsql 过程的主要内容,如果未能解决你的问题,请参考以下文章

从应用程序多次调用数据库过程是不是会影响性能?

sql 调用已经建立的存储过程

如何调用ORACLE程序包中的存储过程

delphi中如何调用sql存储过程?

有没有办法在 PLSQL 包中全局处理定义的异常

在 Oracle 内存缓存中长时间存储 PLSQL 存储过程值