Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exécuter une procédure stockée asynchrone dans SQL Developer

Puisque vous voulez simuler N sessions chacune appelant la procédure 1000/N fois, je ferais probablement quelque chose comme

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;

Cet exemple démarrera 10 sessions dont chacune exécutera la procédure 100 fois en succession rapide en supposant le JOB_QUEUE_PROCESSES de votre base de données est d'au moins 10, ce qui signifie qu'Oracle est autorisé à exécuter simultanément 10 tâches en arrière-plan. Création du CALL_MYPROC_N_TIMES procédure n'est pas strictement nécessaire - cela facilite simplement la création de la chaîne à exécuter dans le travail.

Une alternative serait de soumettre 1000 travaux dont chacun s'appelle simplement MYPROC une fois et en s'appuyant sur le JOB_QUEUE_PROCESSES paramètre pour limiter le nombre de travaux qui seraient exécutés simultanément. Cela fonctionnerait, il est simplement plus difficile de modifier les paramètres de la base de données si vous souhaitez exécuter plus ou moins de sessions simultanées - il est facile d'ajuster L_NUM_SESSIONS dans le code que j'ai posté.