асинхронни операции в oracle

Има ли все пак човек да изпълнява асинхронни операции в oracle.

Ето моята ситуация: имам скъпа процедура (да речем, че отнема 30 минути, за да се стартира). Имам уеб-базиран преден край, който контролира кога да се стартира този процес. Търся задействане на изпълнението на процедурата от предния край, а не наистина да чакам процедурата да завърши, т.е. контролът трябва да се върне в уеб приложението със състояние като например „В ход“. Специално търся механизъм за връщане на контрола към предния край, без да чакам процедурата да завърши изпълнението.

Благодаря предварително,

SK


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


Отговори (1)


Подкрепям искането на OMG Ponies за повече подробности.

В зависимост от това, което се опитвате да постигнете, може да искате да разгледате пакета DBMS_JOBS. Това ви позволява да подадете задание към базата данни, която работи асинхронно. Ако искате базата данни да направи нещо скъпо от изчислителна гледна точка в отговор на GUI например, вашият преден край може да изпълни нещо като

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