【问题标题】:How to execute procedure parallel inside package in plsql如何在plsql中的包内并行执行过程
【发布时间】:2020-05-21 12:46:36
【问题描述】:

我的包裹如下:

CREATE OR REPLACE PACKAGE OT.PK_TEST IS

PROCEDURE A;

Procedure B;
Procedure C;
Procedure D;

END PK_TEST;

身体...

CREATE OR REPLACE PACKAGE BODY  oT.PK_TEST IS
PROCEDURE A 
IS
BEGIN
--creating all required tables
B;
c;
D;
END A;

Procedure B
IS 
BEGIN
...codes
END;

Procedure C
IS 
BEGIN
...codes
END;

Procedure D
IS 
BEGIN
...codes
END;
END PK_TEST;

我执行过程 A,过程 B、C、D 从过程中获取调用。

EXEC OT.PK_TEST.A;

A 是包中执行的第一个过程。所有需要的表都在过程 A 中创建。之后,过程 B、C、D 执行。但是Proceudre B,C,D是相互独立的。因此,在我的包中,程序 B 首先运行,然后程序 C 运行,然后程序 D 运行。这花了我很多时间来运行这个包。在过程 A 中创建所有表之后,我想并行执行过程 B,C,D

如何并行执行所有程序?我正在学习安排工作。使用调度作业是一种好方法还是有其他选择?

【问题讨论】:

  • 使用调度器工具调用 procs 独立 oder 在数据库中创建调度器作业
  • 你能给我看看例子吗?
  • 如何在 oracle 中创建调度程序作业:stackoverflow.com/questions/37019719/…调度程序工具,例如windows的visual cron(它不是免费的),如果你需要免费的,请尝试在so site或google上查看

标签: oracle plsql parallel-processing oracle12c


【解决方案1】:

这是一个使用DBMS_JOB的例子;它非常简单并且工作正常。对于高级案例,请搜索DBMS_SCHEDULER。这个想法很简单:我有一个表和两个将在该表中插入一行的过程。 main 过程将同时调用它们

SQL> create table test (proc varchar2(10), datum date);

Table created.

SQL> create or replace procedure p1 as
  2  begin
  3    dbms_lock.sleep(1);
  4    insert into test (proc, datum) values ('p1', sysdate);
  5  end;
  6  /

Procedure created.

SQL> create or replace procedure p2 as
  2  begin
  3    dbms_lock.sleep(15);
  4    insert into test (proc, datum) values ('p2', sysdate);
  5  end;
  6  /

Procedure created.

SQL> create or replace procedure p_main as
  2    l_job number;
  3  begin
  4    dbms_job.submit(l_job, 'p1;', sysdate, null);
  5    dbms_job.submit(l_job, 'p2;', sysdate, null);
  6    commit;
  7  end;
  8  /

Procedure created.

测试:

SQL> select to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss') right_now from dual;

RIGHT_NOW
-------------------
05.02.2020 19:29:50

SQL> exec p_main;

PL/SQL procedure successfully completed.

SQL> select to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss') right_now from dual;

RIGHT_NOW
-------------------
05.02.2020 19:29:50            --> as you can see, RIGHT NOW is equal to the one
                               --  fetched before calling the P_MAIN procedure,
                               --  although both P1 and P2 procedures are "waiting"
                               --  some time

SQL> select job, next_date, what from user_jobs;

       JOB NEXT_DATE           WHAT
---------- ------------------- --------------------
        76 05.02.2020 19:29:50 p2;         --> both procedures are scheduled to run
        75 05.02.2020 19:29:50 p1;         --  at the same time

SQL>

稍后(约 20 秒后):

SQL> select proc, to_char(datum, 'dd.mm.yyyy hh24:mi:ss') datum From test;

PROC       DATUM
---------- -------------------
p2         05.02.2020 19:30:09        --> both procedures performed INSERT, each
p1         05.02.2020 19:29:55        --  on its own time

SQL> select job, next_date, what from user_jobs;

no rows selected                      --> after procedures have completed, there's none
                                      --  in the queue as they have been scheduled to run
                                      --  only once

SQL>

【讨论】:

  • 非常感谢您的努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2020-02-13
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多