Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Równoległe wywołania w PL/SQL

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łaj DBMS_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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle (stare?) Joins — narzędzie/skrypt do konwersji?

  2. Co i kiedy należy określić setFetchSize()?

  3. Tworzenie lub symulacja dwuwymiarowych tablic w PL/SQL

  4. Jak zwrócić ułamki sekund z wartości daty i godziny w Oracle?

  5. Jak zainstalować Oracle SQL Developer 18.2 w systemie Windows 10?