Como você deseja simular N sessões, cada uma chamando o procedimento 1000/N vezes, eu provavelmente faria 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 exemplo iniciará 10 sessões, cada uma das quais executará o procedimento 100 vezes em rápida sucessão, assumindo o
JOB_QUEUE_PROCESSES
do seu banco de dados é de pelo menos 10, o que significa que o Oracle pode ter 10 tarefas em execução em segundo plano simultaneamente. Criando o CALL_MYPROC_N_TIMES
procedimento não é estritamente necessário-- apenas facilita a construção da string para execução no trabalho. Uma alternativa seria enviar 1.000 trabalhos, cada um dos quais chamado de
MYPROC
uma vez e contando com o JOB_QUEUE_PROCESSES
parâmetro para limitar o número de trabalhos que seriam executados simultaneamente. Isso funcionaria, mas é mais difícil alterar os parâmetros do banco de dados se você quiser executar mais ou menos sessões simultâneas -- é fácil ajustar L_NUM_SESSIONS
no código que postei.