sql >> Base de Datos >  >> RDS >> Oracle

Ejecute el procedimiento almacenado asíncrono en el desarrollador sql

Dado que desea simular N sesiones, cada una de las cuales llama al procedimiento 1000/N veces, probablemente haría 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 ejemplo iniciará 10 sesiones, cada una de las cuales ejecutará el procedimiento 100 veces en rápida sucesión asumiendo los JOB_QUEUE_PROCESSES de su base de datos. es al menos 10, lo que significa que Oracle puede tener 10 trabajos ejecutándose en segundo plano simultáneamente. Creando el CALL_MYPROC_N_TIMES El procedimiento no es estrictamente necesario, solo facilita la construcción de la cadena para ejecutar en el trabajo.

Una alternativa sería enviar 1000 trabajos, cada uno de los cuales se llamaría MYPROC una vez y confiando en JOB_QUEUE_PROCESSES parámetro para limitar el número de trabajos que se ejecutarían simultáneamente. Eso funcionaría, solo que es más difícil cambiar los parámetros de la base de datos si desea ejecutar más o menos sesiones simultáneas; es fácil ajustar L_NUM_SESSIONS en el código que publiqué.