Da Sie N Sitzungen simulieren möchten, die jeweils die Prozedur 1000/N-mal aufrufen, würde ich wahrscheinlich so etwas tun wie
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;
In diesem Beispiel werden 10 Sitzungen gestartet, von denen jede die Prozedur 100 Mal in schneller Folge ausführt, wobei die JOB_QUEUE_PROCESSES
Ihrer Datenbank angenommen werden ist mindestens 10, was bedeutet, dass Oracle 10 Jobs gleichzeitig im Hintergrund ausführen darf. CALL_MYPROC_N_TIMES
erstellen -Prozedur ist nicht unbedingt erforderlich – sie macht es nur einfacher, die Zeichenfolge zu erstellen, die im Job ausgeführt werden soll.
Eine Alternative wäre, 1000 Jobs zu übermitteln, die jeweils nur MYPROC
heißen einmal und unter Berufung auf JOB_QUEUE_PROCESSES
-Parameter, um die Anzahl der gleichzeitig ausgeführten Jobs zu begrenzen. Das würde funktionieren, es ist nur schwieriger, Datenbankparameter zu ändern, wenn Sie mehr oder weniger gleichzeitige Sitzungen ausführen möchten - es ist einfach, L_NUM_SESSIONS
anzupassen in dem Code, den ich gepostet habe.