Ponieważ chcesz zasymulować N sesji, z których każda wywołuje procedurę 1000/N razy, prawdopodobnie zrobiłbym coś takiego
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;
Ten przykład uruchomi 10 sesji, z których każda wykona procedurę 100 razy w krótkim odstępie czasu, zakładając JOB_QUEUE_PROCESSES
bazy danych wynosi co najmniej 10, co oznacza, że Oracle może mieć jednocześnie 10 zadań działających w tle. Tworzenie CALL_MYPROC_N_TIMES
procedura nie jest bezwzględnie konieczna — po prostu ułatwia budowanie łańcucha do wykonania w pracy.
Alternatywą byłoby przesłanie 1000 ofert pracy, z których każde nazywa się właśnie MYPROC
raz i polegając na JOB_QUEUE_PROCESSES
parametr, aby ograniczyć liczbę zadań, które będą uruchamiane jednocześnie. To by zadziałało, po prostu trudniej jest zmienić parametry bazy danych, jeśli chcesz uruchamiać więcej lub mniej jednoczesnych sesji — łatwo jest dostosować L_NUM_SESSIONS
w kodzie, który opublikowałem.