Możesz użyć dbms_job
(lub dbms_scheduler
) pakiet do przesyłania zadań, które będą działać równolegle. Jeśli używasz dbms_job
, przesyłanie zadań będzie częścią transakcji, więc zadania rozpoczną się po zakończeniu transakcji.
CREATE PACKAGE BODY pkg IS
CREATE PROCEDURE do
IS
l_jobno pls_integer;
BEGIN
dbms_job.submit(l_jobno, 'begin other_pkg.other_proc; end;' );
dbms_job.submit(l_jobno, 'begin other_pkg2.other_proc2; end;' );
dbms_job.submit(l_jobno, 'begin other_pkg3.other_proc3; end;' );
END;
END;
Jeśli używasz dbms_scheduler
, tworzenie nowego zadania nie ma charakteru transakcyjnego (tj. za każdym razem, gdy tworzysz nowe zadanie, byłyby niejawne zatwierdzenia), co może powodować problemy z integralnością transakcyjną, jeśli w transakcji wykonywane są inne prace, w których wywoływana jest ta procedura. Z drugiej strony, jeśli używasz dbms_scheduler
, może być łatwiej utworzyć zadania z wyprzedzeniem i po prostu uruchomić je z procedury (lub użyć dbms_scheduler
aby utworzyć łańcuch, który uruchamia zadanie w odpowiedzi na inną akcję lub zdarzenie, takie jak umieszczenie wiadomości w kolejce).
Oczywiście w przypadku obu rozwiązań musisz następnie zbudować infrastrukturę, aby monitorować postęp tych trzech zadań, zakładając, że zależy Ci, kiedy i czy się powiedzie (i czy generują błędy).
Jeśli zamierzasz używać DBMS_SCHEDULER
- Nie ma potrzeby używania dynamicznego SQL. Możesz zrezygnować z
EXECUTE IMMEDIATE
i po prostu wywołajDBMS_SCHEDULER
procedury pakietu bezpośrednio, tak jak każda inna procedura. - Kiedy zadzwonisz do
RUN_JOB
, musisz przekazać drugi parametr.use_current_session
parametr kontroluje, czy zadanie działa w bieżącej sesji (i blokach), czy też działa w oddzielnej sesji (w takim przypadku bieżąca sesja może być kontynuowana i wykonywać inne czynności). Ponieważ chcesz uruchomić wiele zadań równolegle, musisz przekazać wartośćfalse
. - Chociaż nie jest to wymagane, bardziej konwencjonalne byłoby utworzenie zadań raz (za pomocą
auto_drop
ustawione na false), a następnie po prostu uruchom je w swojej procedurze.
Więc prawdopodobnie chciałbyś utworzyć zadania poza pakietem, a wtedy twoja procedura stałaby się po prostu
CREATE PACKAGE BODY pkg IS
CREATE PROCEDURE do
IS
BEGIN
DBMS_SCHEDULER.RUN_JOB('job_other_pkg.other_proc', false);
DBMS_SCHEDULER.RUN_JOB('job_other_pkg2.other_proc2', false);
DBMS_SCHEDULER.RUN_JOB('job_other_pkg3.other_proc3', false);
END;
END;