Тъй като искате да симулирате 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
в кода, който публикувах.