由于您要模拟N个会话,每个会话均调用该过程1000 / N次,因此我可能会执行类似的 *** 作
CREATE OR REPLACE PROCEDURE call_myproc_n_times( p_n IN NUMBER )AS p_status NUMBER; p_ora_error_pre VARCHAr2(1000); p_ora_error_msg VARCHAr2(1000);BEGIN FOR i IN 1 .. p_n LOOP myproc( 'test', p_status, p_ora_error_pre, 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在我发布的代码中进行调整很容易。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)