Da du vil simulere N sessioner, der hver kalder proceduren 1000/N gange, ville jeg nok gøre noget lignende
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;
Dette eksempel starter 10 sessioner, som hver vil udføre proceduren 100 gange i hurtig rækkefølge, forudsat at din databases JOB_QUEUE_PROCESSES
er mindst 10, hvilket betyder, at Oracle har tilladelse til at have 10 job kørende i baggrunden samtidigt. Oprettelse af CALL_MYPROC_N_TIMES
proceduren er ikke strengt nødvendig - den gør bare opbygningen af strengen til at udføre i jobbet nemmere.
Et alternativ ville være at indsende 1000 job, som hver blot kaldes MYPROC
én gang og stole på JOB_QUEUE_PROCESSES
parameter for at begrænse antallet af job, der køres samtidigt. Det ville virke, det er bare sværere at ændre databaseparametre, hvis du vil køre flere af færre samtidige sessioner - det er nemt at justere L_NUM_SESSIONS
i den kode, jeg sendte.