U kunt de dbms_job
. gebruiken (of dbms_scheduler
) pakket om taken in te dienen die parallel worden uitgevoerd. Als u dbms_job
. gebruikt , zal het indienen van de opdrachten deel uitmaken van de transactie, zodat de opdrachten starten zodra de transactie is voltooid.
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;
Als u dbms_scheduler
. gebruikt , is het creëren van een nieuwe taak niet transactioneel (d.w.z. er zouden impliciete vastleggingen zijn elke keer dat u een nieuwe taak maakt), wat problemen kan veroorzaken met de transactie-integriteit als er ander werk wordt gedaan in de transactie waarin deze procedure wordt aangeroepen. Aan de andere kant, als u dbms_scheduler
. gebruikt , kan het gemakkelijker zijn om de jobs van tevoren aan te maken en ze gewoon vanuit de procedure uit te voeren (of om dbms_scheduler
te gebruiken om een keten te maken die de taak uitvoert als reactie op een andere actie of gebeurtenis, zoals het plaatsen van een bericht in een wachtrij).
Bij beide oplossingen moet je natuurlijk de infrastructuur bouwen om de voortgang van deze drie taken te volgen, ervan uitgaande dat het je kan schelen wanneer en of ze slagen (en of ze fouten genereren).
Als u DBMS_SCHEDULER
. gaat gebruiken
- Het is niet nodig om dynamische SQL te gebruiken. U kunt de
EXECUTE IMMEDIATE
en bel gewoon deDBMS_SCHEDULER
pakketprocedures direct, net als bij elke andere procedure. - Als je
RUN_JOB
belt , moet u een tweede parameter doorgeven. Deuse_current_session
parameter bepaalt of de taak wordt uitgevoerd in de huidige sessie (en blokken) of dat deze in een afzonderlijke sessie wordt uitgevoerd (in dat geval kan de huidige sessie doorgaan en andere dingen doen). Aangezien u meerdere taken parallel wilt uitvoeren, moet u de waardefalse
. doorgeven . - Hoewel het niet vereist is, zou het conventioneler zijn om de jobs één keer aan te maken (met
auto_drop
ingesteld op false) en voer ze dan gewoon uit vanuit uw procedure.
Dus je zou waarschijnlijk de banen buiten het pakket willen creëren en dan zou je procedure gewoon
. wordenCREATE 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;