Dal momento che vuoi simulare N sessioni ciascuna chiamando la procedura 1000/N volte, probabilmente farei qualcosa del tipo
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;
Questo esempio avvierà 10 sessioni ciascuna delle quali eseguirà la procedura 100 volte in rapida successione assumendo il JOB_QUEUE_PROCESSES
del tuo database è almeno 10, il che significa che Oracle può avere 10 lavori in esecuzione in background contemporaneamente. Creazione del CALL_MYPROC_N_TIMES
la procedura non è strettamente necessaria:semplifica semplicemente la creazione della stringa da eseguire nel lavoro.
Un'alternativa sarebbe inviare 1000 lavori ciascuno dei quali chiamato semplicemente MYPROC
una volta e basandosi su JOB_QUEUE_PROCESSES
parametro per limitare il numero di lavori che verrebbero eseguiti contemporaneamente. Funzionerebbe, è solo più difficile modificare i parametri del database se si desidera eseguire più sessioni simultanee o meno:è facile regolare L_NUM_SESSIONS
nel codice che ho postato.