如何在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>
我有如下包裹:
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>