Sql oracle中的并行处理

Sql oracle中的并行处理,sql,oracle,plsql,parallel-processing,Sql,Oracle,Plsql,Parallel Processing,我有一个“过程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; 此处,“过程A”应返回空光标,而无需等待“过程B”完成 如何在

我有一个“过程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;
此处,“过程A”应返回空光标,而无需等待“过程B”完成

如何在oracle中实现这一点


提前感谢。

假设您不需要过程B与过程A在同一会话中运行,您可以将作业安排为异步运行,即

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;
您将从A返回,一个作业将被立即安排在一个单独的会话中运行过程B请注意,在当前会话提交之前,该作业不会启动,这就是我在此处添加提交的原因-如果您的代码将在其他地方提交,您可以取消该操作。dbms_job.submit正在执行的所有操作都是创建作业-在过程返回之前,作业不会开始执行

如果B接受参数,则需要动态构建PL/SQL块。所以如果B取两个数字参数

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;

假设您不需要过程B与过程A在同一会话中运行,您可以将作业安排为异步运行,即

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;
您将从A返回,一个作业将被立即安排在一个单独的会话中运行过程B请注意,在当前会话提交之前,该作业不会启动,这就是我在此处添加提交的原因-如果您的代码将在其他地方提交,您可以取消该操作。dbms_job.submit正在执行的所有操作都是创建作业-在过程返回之前,作业不会开始执行

如果B接受参数,则需要动态构建PL/SQL块。所以如果B取两个数字参数

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;

我想不出别的办法。在同一事务中运行两个线程似乎是完全不可能的。这很好…但有一点疑问..执行'Proecure a'将等待dbms_作业。提交l_作业否,'BEGIN B;"完";;若要完成或只是简单地执行,将触发该操作并结束过程a。它将等待DBMS_作业。提交完成,是。但这几乎是瞬间发生的。程序B将在稍后的单独会话中执行。还有一个疑问是,程序B是否有一些参数,如Barg1、arg2……如何使用dbms_作业调度该程序B。submit…….dbms_作业。submitl_作业否,'BEGIN Barg1、arg2;终止由于以这种方式传递这些参数时会引发错误…在将参数传递给过程B(它是dbms_作业)时,我们是否需要遵循某种格式。创建或替换过程al_param1 varchar220,l_param2 varchar220,p_cur_out SYS_REFCURSOR作为l_jobno pls_integer;开始打开p_cur_out,选择将null转换为varchar264 empname,将null转换为dual中的整数empid;dbms|u job.submit l|u jobno,‘开始B’|| l|u参数1 | | |’、‘l|u参数2 | |’;"完";;犯罪结束a;我想不出别的办法。在同一事务中运行两个线程似乎是完全不可能的。这很好…但有一点疑问..执行'Proecure a'将等待dbms_作业。提交l_作业否,'BEGIN B;"完";;若要完成或只是简单地执行,将触发该操作并结束过程a。它将等待DBMS_作业。提交完成,是。但这几乎是瞬间发生的。程序B将在稍后的单独会话中执行。还有一个疑问是,程序B是否有一些参数,如Barg1、arg2……如何使用dbms_作业调度该程序B。submit…….dbms_作业。submitl_作业否,'BEGIN Barg1、arg2;终止由于以这种方式传递这些参数时会引发错误…在将参数传递给过程B(它是dbms_作业)时,我们是否需要遵循某种格式。创建或替换过程al_param1 varchar220,l_param2 varchar220,p_cur_out SYS_REFCURSOR作为l_jobno pls_integer;开始打开p_cur_out,选择将null转换为varchar264 empname,将null转换为dual中的整数empid;dbms|u job.submit l|u jobno,‘开始B’|| l|u参数1 | | |’、‘l|u参数2 | |’;"完";;犯罪结束a;