oracle中的并行处理

K R*_*thi 1 sql oracle parallel-processing plsql

我有一个'过程A',它必须将一个空光标返回到前端,然后立即继续下一步,它将调用一个过程,该过程将花费20分钟来完成过程.

Procedure A(cur_out refcursor)
begin

 OPEN cur_out  for
 select 
 null empname,
 null empid
 from dual;

procedure B();//Will take 20 min

end;
Run Code Online (Sandbox Code Playgroud)

这里'Procedure A'应返回null游标而不等待'Procedure B'完成.

如何在oracle中实现这一点.

提前致谢.

Jus*_*ave 7

假设您不需要在与A相同的会话中运行过程B,则可以将作业调度为异步运行,即

CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
  l_jobno pls_integer;
BEGIN
  OPEN p_cur_out 
   FOR SELECT cast( null as varchar2(64) ) empname, 
              cast( null as integer ) empid
         FROM dual;

  dbms_job.submit( l_jobno,
                   'BEGIN B(); END;' );
  commit;
END a;
Run Code Online (Sandbox Code Playgroud)

您将从A返回并且将立即调度作业以在单独的会话中运行过程B(请注意,作业将在当前会话提交之前不会启动,这就是我在此处添加提交的原因 - 如果您的代码正在运行在其他地方提交,你可以消除那个).所有dbms_job.submit正在创建作业 - 直到过程返回后,作业才会开始执行.

如果B接受参数,则需要动态构建PL/SQL块.因此,如果B采用两个NUMBER参数

CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
  l_jobno  pls_integer;
  l_param1 pls_integer;
  l_param2 pls_integer;
BEGIN
  OPEN p_cur_out 
   FOR SELECT cast( null as varchar2(64) ) empname, 
              cast( null as integer ) empid
         FROM dual;

  dbms_job.submit( l_jobno,
                   'BEGIN B(' || to_char( l_param1 ) || ', ' ||
                                 to_char( l_param2 ) || '); END;' );
  commit;
END a;
Run Code Online (Sandbox Code Playgroud)