sql >> Databáze >  >> RDS >> Oracle

Spusťte asynchronně uloženou proceduru ve vývojáři sql

Protože chcete simulovat N relací, z nichž každá volá proceduru 1000/Nkrát, pravděpodobně bych udělal něco jako

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;

Tento příklad spustí 10 relací, z nichž každá provede proceduru 100krát rychle za sebou za předpokladu JOB_QUEUE_PROCESSES vaší databáze je alespoň 10, což znamená, že Oracle může mít na pozadí spuštěných 10 úloh současně. Vytvoření CALL_MYPROC_N_TIMES procedura není nezbytně nutná – pouze usnadňuje vytváření řetězce, který se má v úloze provést.

Alternativou by bylo odeslání 1000 úloh, z nichž každá se jmenovala MYPROC jednou a spoléhat se na JOB_QUEUE_PROCESSES parametr pro omezení počtu úloh, které by byly spuštěny současně. To by fungovalo, jen je obtížnější měnit parametry databáze, pokud chcete spouštět více nebo méně simultánních relací – je snadné upravit L_NUM_SESSIONS v kódu, který jsem zveřejnil.




  1. Postgres:Můžeme mít sloupec automatického přírůstku ve složeném klíči

  2. SQL Server FOR JSON AUTO Příklady (T-SQL)

  3. Jak používat MySQL Found_Rows() v PHP?

  4. Jak určit regex Ruby při použití Active Record v Rails?