我想使用 Oracle SQL Developer 多次异步执行存储过程。
伪代码
var pStatus number
var pOraErrCd varchar2
var pOraErrMsg varchar2
for i 1 .. 1000 -- do async
loop
exec myproc('test',:pStatus ,:pOraErrCd ,:pOraErrMsg);
end loop;
存储过程的目的是执行一些插入操作。为了测试,我只想多次异步执行存储过程。我不关心任何返回值。
有没有"easy"方法来做到这一点?
由于您想模拟 N 个会话,每个会话调用过程 1000/N 次,我可能会这样做
CREATE OR REPLACE PROCEDURE call_myproc_n_times( p_n IN NUMBER )
AS
p_status NUMBER;
p_ora_error_code VARCHAR2(1000);
p_ora_error_msg VARCHAR2(1000);
BEGIN
FOR i IN 1 .. p_n
LOOP
myproc( 'test',
p_status,
p_ora_error_code,
p_ora_error_msg );
END LOOP;
END;
DECLARE
l_num_sessions number := 10;
l_exec_per_session number := 100;
l_jobno pls_integer;
BEGIN
FOR i IN 1 .. l_num_sessions
LOOP
dbms_job.submit(
l_jobno,
'BEGIN ' ||
' call_myproc_n_times( ' || l_exec_per_session || ' ); ' ||
'END;',
sysdate + interval '1' minute );
END LOOP;
commit;
END;
此示例将启动 10 个会话,每个会话将快速连续执行该过程 100 次,假设您的数据库的JOB_QUEUE_PROCESSES
至少为 10 意味着 Oracle 允许同时在后台运行 10 个作业。创建CALL_MYPROC_N_TIMES
过程并不是绝对必要的——它只是使构建要在作业中执行的字符串变得更容易。
另一种方法是提交 1000 个作业,每个作业都刚刚调用MYPROC
一次并依靠JOB_QUEUE_PROCESSES
参数来限制同时运行的作业数量。这可行,如果您想运行更多或更少的并发会话,则更改数据库参数会更加困难 - 很容易调整L_NUM_SESSIONS
在我发布的代码中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)