Выполнить асинхронную хранимую процедуру в SQL Developer - PullRequest
3 голосов
/ 06 сентября 2011

Я хотел бы использовать Oracle SQL Developer для выполнения хранимой процедуры асинхронно большое количество раз.

Псевдокод

var pStatus number
var pOraErrCd varchar2
var pOraErrMsg varchar2
for i 1 .. 1000 -- do async
loop 
    exec myproc('test',:pStatus ,:pOraErrCd ,:pOraErrMsg);
end loop;

Цель хранимой процедурыэто сделать некоторые вставки.Для тестирования я просто хочу выполнить хранимую процедуру асинхронно большое количество раз.Меня не волнует возвращаемое значение.

Есть ли "простой" способ сделать это?

1 Ответ

5 голосов
/ 07 сентября 2011

Поскольку вы хотите смоделировать N сеансов, каждый из которых вызывает процедуру 1000 / N раз, я, вероятно, сделал бы что-то вроде

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;

В этом примере будет запущено 10 сеансов, каждый из которых будет выполнять процедуру 100 раз в быстрой последовательности, предполагая, что значение JOB_QUEUE_PROCESSES в вашей базе данных по крайней мере равно 10, что означает, что Oracle может одновременно иметь 10 заданий в фоновом режиме. Создание процедуры CALL_MYPROC_N_TIMES не является строго обязательным - она ​​просто упрощает сборку строки для выполнения в задании.

Альтернативой может быть отправка 1000 заданий, каждое из которых просто вызывается MYPROC один раз и полагается на параметр JOB_QUEUE_PROCESSES, чтобы ограничить количество заданий, которые будут выполняться одновременно. Это бы сработало, просто сложнее изменить параметры базы данных, если вы хотите запускать большее количество одновременных сеансов - легко настроить L_NUM_SESSIONS в коде, который я разместил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...