Параллельная обработка в Oracle - PullRequest
1 голос
/ 05 октября 2010

У меня была «процедура A», в которой он должен возвращать нулевой курсор на передний конец, а затем немедленно должен перейти к следующему шагу, на котором он вызовет процедуру, которая займет 20 минут для завершения процедуры.

Procedure A(cur_out refcursor)
begin

 OPEN cur_out  for
 select 
 null empname,
 null empid
 from dual;

procedure B();//Will take 20 min

end;

Здесь «Процедура A» должна возвращать нулевой курсор, не дожидаясь завершения «Процедуры B».

Как реализовать это в оракуле.

Заранее спасибо.

1 Ответ

7 голосов
/ 05 октября 2010

Предполагая, что вам не нужна процедура B для запуска в том же сеансе, что и A, вы можете запланировать выполнение задания асинхронно, т.е.

CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
  l_jobno pls_integer;
BEGIN
  OPEN p_cur_out 
   FOR SELECT cast( null as varchar2(64) ) empname, 
              cast( null as integer ) empid
         FROM dual;

  dbms_job.submit( l_jobno,
                   'BEGIN B(); END;' );
  commit;
END a;

Вы вернетесь из A, и сразу будет запланировано задание на выполнение процедуры B в отдельном сеансе (обратите внимание, что задание не запустится, пока не завершится текущий сеанс, поэтому я добавил здесь коммит - если ваш код будет фиксироваться в другом месте, вы можете устранить это). Все, что делает dbms_job.submit - это создает задание - задание не начнет выполняться до тех пор, пока процедура не вернется.

Если B принимает аргументы, вам нужно динамически построить блок PL / SQL. Так что, если B принимает два параметра NUMBER

CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
  l_jobno  pls_integer;
  l_param1 pls_integer;
  l_param2 pls_integer;
BEGIN
  OPEN p_cur_out 
   FOR SELECT cast( null as varchar2(64) ) empname, 
              cast( null as integer ) empid
         FROM dual;

  dbms_job.submit( l_jobno,
                   'BEGIN B(' || to_char( l_param1 ) || ', ' ||
                                 to_char( l_param2 ) || '); END;' );
  commit;
END a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...