Protože chcete simulovat N relací, z nichž každá volá proceduru 1000/Nkrát, pravděpodobně bych udělal něco jako
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;
Tento příklad spustí 10 relací, z nichž každá provede proceduru 100krát rychle za sebou za předpokladu JOB_QUEUE_PROCESSES
vaší databáze je alespoň 10, což znamená, že Oracle může mít na pozadí spuštěných 10 úloh současně. Vytvoření CALL_MYPROC_N_TIMES
procedura není nezbytně nutná – pouze usnadňuje vytváření řetězce, který se má v úloze provést.
Alternativou by bylo odeslání 1000 úloh, z nichž každá se jmenovala MYPROC
jednou a spoléhat se na JOB_QUEUE_PROCESSES
parametr pro omezení počtu úloh, které by byly spuštěny současně. To by fungovalo, jen je obtížnější měnit parametry databáze, pokud chcete spouštět více nebo méně simultánních relací – je snadné upravit L_NUM_SESSIONS
v kódu, který jsem zveřejnil.