sql >> Database >  >> RDS >> Oracle

Parallelliseren van oproepen in PL/SQL

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 de DBMS_SCHEDULER pakketprocedures direct, net als bij elke andere procedure.
  • Als je RUN_JOB belt , moet u een tweede parameter doorgeven. De use_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 waarde false . 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

. worden
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;


  1. Converteer DateTime voor MySQL met C#

  2. Hoe krijg ik informatie over een index- en tabeleigenaar in Oracle?

  3. Overgecompliceerde Oracle jdbc BLOB-afhandeling

  4. 3 manieren om het schema van een resultatenset in SQL Server te krijgen