Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Execute o procedimento armazenado assíncrono no desenvolvedor sql


Como você deseja simular N sessões, cada uma chamando o procedimento 1000/N vezes, eu provavelmente faria algo como
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;

Este exemplo iniciará 10 sessões, cada uma das quais executará o procedimento 100 vezes em rápida sucessão, assumindo o JOB_QUEUE_PROCESSES do seu banco de dados é de pelo menos 10, o que significa que o Oracle pode ter 10 tarefas em execução em segundo plano simultaneamente. Criando o CALL_MYPROC_N_TIMES procedimento não é estritamente necessário-- apenas facilita a construção da string para execução no trabalho.

Uma alternativa seria enviar 1.000 trabalhos, cada um dos quais chamado de MYPROC uma vez e contando com o JOB_QUEUE_PROCESSES parâmetro para limitar o número de trabalhos que seriam executados simultaneamente. Isso funcionaria, mas é mais difícil alterar os parâmetros do banco de dados se você quiser executar mais ou menos sessões simultâneas -- é fácil ajustar L_NUM_SESSIONS no código que postei.