Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Führen Sie eine asynchrone gespeicherte Prozedur in SQL Developer aus

Da Sie N Sitzungen simulieren möchten, die jeweils die Prozedur 1000/N-mal aufrufen, würde ich wahrscheinlich so etwas tun wie

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;

In diesem Beispiel werden 10 Sitzungen gestartet, von denen jede die Prozedur 100 Mal in schneller Folge ausführt, wobei die JOB_QUEUE_PROCESSES Ihrer Datenbank angenommen werden ist mindestens 10, was bedeutet, dass Oracle 10 Jobs gleichzeitig im Hintergrund ausführen darf. CALL_MYPROC_N_TIMES erstellen -Prozedur ist nicht unbedingt erforderlich – sie macht es nur einfacher, die Zeichenfolge zu erstellen, die im Job ausgeführt werden soll.

Eine Alternative wäre, 1000 Jobs zu übermitteln, die jeweils nur MYPROC heißen einmal und unter Berufung auf JOB_QUEUE_PROCESSES -Parameter, um die Anzahl der gleichzeitig ausgeführten Jobs zu begrenzen. Das würde funktionieren, es ist nur schwieriger, Datenbankparameter zu ändern, wenn Sie mehr oder weniger gleichzeitige Sitzungen ausführen möchten - es ist einfach, L_NUM_SESSIONS anzupassen in dem Code, den ich gepostet habe.