sql >> Database >  >> RDS >> Oracle

Voer asynchrone opgeslagen procedure uit in sql-ontwikkelaar

Aangezien je N sessies wilt simuleren die elk de procedure 1000/N keer aanroepen, zou ik waarschijnlijk zoiets doen als

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;

Dit voorbeeld start 10 sessies die elk de procedure 100 keer snel achter elkaar zullen uitvoeren, ervan uitgaande dat de JOB_QUEUE_PROCESSES van uw database is minimaal 10, wat betekent dat Oracle 10 taken tegelijkertijd op de achtergrond mag hebben. De CALL_MYPROC_N_TIMES . maken procedure is niet strikt noodzakelijk-- het maakt het bouwen van de string om in de job uit te voeren alleen maar gemakkelijker.

Een alternatief zou zijn om 1000 jobs in te dienen die elk gewoon MYPROC . worden genoemd eenmaal en vertrouwend op de JOB_QUEUE_PROCESSES parameter om het aantal taken te beperken dat tegelijkertijd zou worden uitgevoerd. Dat zou werken, het is alleen moeilijker om databaseparameters te wijzigen als u meer of minder gelijktijdige sessies wilt uitvoeren - het is eenvoudig om L_NUM_SESSIONS aan te passen in de code die ik heb gepost.




  1. MySQL-selectieverzoek parallel (python)

  2. Zoeken in meerdere kolommen

  3. Topbronnen voor leren en trainen van PostgreSQL

  4. Meedoen en meerdere en voorwaarden