Oracle
 sql >> Database >  >> RDS >> Oracle

Esegui la stored procedure asincrona nello sviluppatore sql

Dal momento che vuoi simulare N sessioni ciascuna chiamando la procedura 1000/N volte, probabilmente farei qualcosa del tipo

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;

Questo esempio avvierà 10 sessioni ciascuna delle quali eseguirà la procedura 100 volte in rapida successione assumendo il JOB_QUEUE_PROCESSES del tuo database è almeno 10, il che significa che Oracle può avere 10 lavori in esecuzione in background contemporaneamente. Creazione del CALL_MYPROC_N_TIMES la procedura non è strettamente necessaria:semplifica semplicemente la creazione della stringa da eseguire nel lavoro.

Un'alternativa sarebbe inviare 1000 lavori ciascuno dei quali chiamato semplicemente MYPROC una volta e basandosi su JOB_QUEUE_PROCESSES parametro per limitare il numero di lavori che verrebbero eseguiti contemporaneamente. Funzionerebbe, è solo più difficile modificare i parametri del database se si desidera eseguire più sessioni simultanee o meno:è facile regolare L_NUM_SESSIONS nel codice che ho postato.