Puisque vous voulez simuler N sessions chacune appelant la procédure 1000/N fois, je ferais probablement quelque chose comme
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;
Cet exemple démarrera 10 sessions dont chacune exécutera la procédure 100 fois en succession rapide en supposant le JOB_QUEUE_PROCESSES
de votre base de données est d'au moins 10, ce qui signifie qu'Oracle est autorisé à exécuter simultanément 10 tâches en arrière-plan. Création du CALL_MYPROC_N_TIMES
procédure n'est pas strictement nécessaire - cela facilite simplement la création de la chaîne à exécuter dans le travail.
Une alternative serait de soumettre 1000 travaux dont chacun s'appelle simplement MYPROC
une fois et en s'appuyant sur le JOB_QUEUE_PROCESSES
paramètre pour limiter le nombre de travaux qui seraient exécutés simultanément. Cela fonctionnerait, il est simplement plus difficile de modifier les paramètres de la base de données si vous souhaitez exécuter plus ou moins de sessions simultanées - il est facile d'ajuster L_NUM_SESSIONS
dans le code que j'ai posté.