Dado que desea simular N sesiones, cada una de las cuales llama al procedimiento 1000/N veces, probablemente haría algo como
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;
Este ejemplo iniciará 10 sesiones, cada una de las cuales ejecutará el procedimiento 100 veces en rápida sucesión asumiendo los JOB_QUEUE_PROCESSES
de su base de datos. es al menos 10, lo que significa que Oracle puede tener 10 trabajos ejecutándose en segundo plano simultáneamente. Creando el CALL_MYPROC_N_TIMES
El procedimiento no es estrictamente necesario, solo facilita la construcción de la cadena para ejecutar en el trabajo.
Una alternativa sería enviar 1000 trabajos, cada uno de los cuales se llamaría MYPROC
una vez y confiando en JOB_QUEUE_PROCESSES
parámetro para limitar el número de trabajos que se ejecutarían simultáneamente. Eso funcionaría, solo que es más difícil cambiar los parámetros de la base de datos si desea ejecutar más o menos sesiones simultáneas; es fácil ajustar L_NUM_SESSIONS
en el código que publiqué.