如何在plsql中的包内并行执行程序

How to execute procedure parallel inside package in plsql

我有如下包裹:

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 运行s 中,首先是程序 C 运行s,然后是程序 D 运行s,最后是程序 D 运行s。这花了我很多时间 运行 这个包。我想在过程 A 中创建所有表后并行执行过程 B,C,D

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

这是一个使用 DBMS_JOB 的例子;它非常简单并且工作正常。对于高级案例,请搜索 DBMS_SCHEDULER。这个想法很简单:我有一个 table 和两个程序,它们将在 table 中插入一行。 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>