Поскольку вы хотите смоделировать N сеансов, каждый из которых вызывает процедуру 1000 / N раз, я, вероятно, сделал бы что-то вроде
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;
В этом примере будет запущено 10 сеансов, каждый из которых будет выполнять процедуру 100 раз в быстрой последовательности, предполагая, что значение JOB_QUEUE_PROCESSES
в вашей базе данных по крайней мере равно 10, что означает, что Oracle может одновременно иметь 10 заданий в фоновом режиме. Создание процедуры CALL_MYPROC_N_TIMES
не является строго обязательным - она просто упрощает сборку строки для выполнения в задании.
Альтернативой может быть отправка 1000 заданий, каждое из которых просто вызывается MYPROC
один раз и полагается на параметр JOB_QUEUE_PROCESSES
, чтобы ограничить количество заданий, которые будут выполняться одновременно. Это бы сработало, просто сложнее изменить параметры базы данных, если вы хотите запускать большее количество одновременных сеансов - легко настроить L_NUM_SESSIONS
в коде, который я разместил.