sql >> Databasteknik >  >> RDS >> Oracle

Kör asynkroniserad lagrad procedur i sql-utvecklare

Eftersom du vill simulera N sessioner som varje anropar proceduren 1000/N gånger, skulle jag förmodligen göra något liknande

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;

Det här exemplet kommer att starta 10 sessioner som var och en kommer att utföra proceduren 100 gånger i snabb följd förutsatt att din databas JOB_QUEUE_PROCESSES är minst 10 vilket betyder att Oracle tillåts ha 10 jobb som körs i bakgrunden samtidigt. Skapar CALL_MYPROC_N_TIMES proceduren är inte strikt nödvändig – det gör bara att bygga strängen för att utföra jobbet enklare.

Ett alternativ skulle vara att skicka in 1 000 jobb som var och en bara kallas MYPROC en gång och förlitar sig på JOB_QUEUE_PROCESSES parameter för att begränsa antalet jobb som körs samtidigt. Det skulle fungera, det är bara svårare att ändra databasparametrar om du vill köra fler av färre samtidiga sessioner-- det är enkelt att justera L_NUM_SESSIONS i koden jag postade.




  1. Hur man påskyndar insättningsprestanda i PostgreSQL

  2. Hur får man livemeddelandeuppdateringar från mysql med hjälp av websockets?

  3. Ändra utdata från Getdate

  4. SSIS - Utföra en sökning på en annan tabell för att få relaterad kolumn