sql >> Database teknologi >  >> RDS >> Oracle

Udfør asynkron lagret procedure i sql-udvikler

Da du vil simulere N sessioner, der hver kalder proceduren 1000/N gange, ville jeg nok gøre noget lignende

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;

Dette eksempel starter 10 sessioner, som hver vil udføre proceduren 100 gange i hurtig rækkefølge, forudsat at din databases JOB_QUEUE_PROCESSES er mindst 10, hvilket betyder, at Oracle har tilladelse til at have 10 job kørende i baggrunden samtidigt. Oprettelse af CALL_MYPROC_N_TIMES proceduren er ikke strengt nødvendig - den gør bare opbygningen af ​​strengen til at udføre i jobbet nemmere.

Et alternativ ville være at indsende 1000 job, som hver blot kaldes MYPROC én gang og stole på JOB_QUEUE_PROCESSES parameter for at begrænse antallet af job, der køres samtidigt. Det ville virke, det er bare sværere at ændre databaseparametre, hvis du vil køre flere af færre samtidige sessioner - det er nemt at justere L_NUM_SESSIONS i den kode, jeg sendte.




  1. Hvordan Postgresql KOPIERING TIL STDIN Med CSV opdateres ved konflikt?

  2. MySQL-forespørgsel for at vælge resultater med automatisk stigning som en ny kolonne tilføjet i resultatet

  3. Oracle (+) operatør

  4. Kunne ikke indlæse filen eller samlingen 'System.Data-fejl ved implementering af applikation på produktionsdatabase