Eftersom du vill simulera N sessioner som varje anropar proceduren 1000/N gånger, skulle jag förmodligen göra något liknande
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;
Det här exemplet kommer att starta 10 sessioner som var och en kommer att utföra proceduren 100 gånger i snabb följd förutsatt att din databas JOB_QUEUE_PROCESSES
är minst 10 vilket betyder att Oracle tillåts ha 10 jobb som körs i bakgrunden samtidigt. Skapar CALL_MYPROC_N_TIMES
proceduren är inte strikt nödvändig – det gör bara att bygga strängen för att utföra jobbet enklare.
Ett alternativ skulle vara att skicka in 1 000 jobb som var och en bara kallas MYPROC
en gång och förlitar sig på JOB_QUEUE_PROCESSES
parameter för att begränsa antalet jobb som körs samtidigt. Det skulle fungera, det är bara svårare att ändra databasparametrar om du vill köra fler av färre samtidiga sessioner-- det är enkelt att justera L_NUM_SESSIONS
i koden jag postade.