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中实现这一点.
提前致谢.
假设您不需要在与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)
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |