асинхронные операции в оракуле

В любом случае можно запускать асинхронные операции в оракуле.

Вот моя ситуация: у меня есть дорогой процесс (скажем, он выполняется 30 минут). У меня есть веб-интерфейс, который контролирует, когда этот процесс должен запускаться. Я ищу запуск процесса из внешнего интерфейса и на самом деле не жду завершения процесса, т. Е. Элемент управления должен вернуться в веб-приложение со статусом, например, «Выполняется». Я специально ищу механизм, чтобы вернуть управление интерфейсу, не дожидаясь завершения выполнения процедуры.

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

SK


person Sash    schedule 08.11.2010    source источник


Ответы (1)


Я бы поддержал запрос OMG Ponies на более подробную информацию.

В зависимости от того, чего вы пытаетесь достичь, вы можете заглянуть в пакет DBMS_JOBS. Это позволяет вам отправить задание в базу данных, которая работает асинхронно. Если вы хотите, чтобы база данных делала что-то ресурсоемкое в ответ на графический интерфейс, например, ваш внешний интерфейс мог бы выполнить что-то вроде

CREATE OR REPLACE PROCEDURE run_asynchronously( p_some_parameter IN PLS_INTEGER, 
                                                p_jobno OUT PLS_INTEGER )
AS
BEGIN
  dbms_job.submit( p_jobno,
                   'BEGIN ' ||
                      ' some_expensive_procedure( ' || 
                              to_char(p_some_parameter) || ' ); ' ||
                   'END;' );
  RETURN p_jobno;
END;

Это отправит фоновое задание для запуска SOME_EXPENSIVE_PROCEDURE, передав P_SOME_PARAMETER. Задание не запустится до тех пор, пока базовая транзакция не зафиксируется, что отлично, если SOME_EXPENSIVE_PROCEDURE делает что-то, что нельзя откатить, например, отправка электронной почты или передача файла по FTP.

person Justin Cave    schedule 08.11.2010
comment
+1. Хотя я бы рекомендовал вам сначала взглянуть на DBMS_SCHEDULER. Он немного мощнее, но он автоматически фиксирует задания, поэтому иногда вам все еще нужен DBMS_JOB. - person Jon Heller; 09.11.2010