kra*_*626 3 sql oracle plsql asynchronous
我想使用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;
Run Code Online (Sandbox Code Playgroud)
存储过程的目的是进行一些插入.对于测试,我只想异步执行存储过程很多次.我不关心任何返回值.
有一种"简单"的方法吗?
既然你想要模拟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;
Run Code Online (Sandbox Code Playgroud)
此示例将启动10个会话,每个会话将快速连续执行该过程100次,假设您的数据库JOB_QUEUE_PROCESSES至少为10,这意味着允许Oracle同时在后台运行10个作业.创建CALL_MYPROC_N_TIMES过程并不是绝对必要的 - 它只是使构建字符串更容易在作业中执行.
另一种方法是提交1000个作业,每个作业只调用MYPROC一次,并依赖JOB_QUEUE_PROCESSES参数来限制同时运行的作业数量.如果你想运行更少的同步会话,那么更改数据库参数会更加困难 - L_NUM_SESSIONS在我发布的代码中很容易调整.
| 归档时间: |
|
| 查看次数: |
10179 次 |
| 最近记录: |