PL SQL. У меня есть 3 хранимых процедуры, и они вставляют / заполняют различные таблицы Oracle Db. Я хочу, чтобы они работали в параллельном порядке ... Есть идеи? - PullRequest
1 голос
/ 09 марта 2020

У меня есть 3 хранимые процедуры, 1 основная хранимая процедура и 1 конечная хранимая процедура.

Я хочу, чтобы OneSP, TwoSP и ThreeSP работали в одно и то же время (параллельно), а endStoredProcedure будет работать только до ONE, TWO , ТРИ завершено.

Эта основная хранимая процедура будет запускаться сторонним программным обеспечением, поэтому я не хочу, чтобы они запускались в какое-то особое время.

Я знаю, что это глупый вопрос, но, пожалуйста, помогите я, ребята, очень ценю!

create or replace Procedure MasterStoredProcedure as

BEGIN
     OneSP;--     These three SP insert data into three different tables and running in parallel .

     TwoSP;--    These three SP insert data into three different tables and running in parallel .

     ThreeSP;--    These three SP insert data into three different tables and running in parallel .


     endStoredProcedure;   --this SP will only run until ONE, TWO, Three all complete


END

1 Ответ

4 голосов
/ 09 марта 2020

В обычном исполнении невозможно добиться параллельного выполнения процедуры.

Но есть способ добиться этого с помощью пакета DBMS_JOB. Он выполнит процедуры, заданные заданию в фоновом режиме, и мы получим уведомление, как только оно будет завершено с использованием DBMS_ALERT.SIGNAL и DBMS_ALERT.WAITONE метода:

DECLARE
    LV_JOB_NO   NUMBER;
    MESSAGE1    VARCHAR2(50);
    MESSAGE2    VARCHAR2(50);
    MESSAGE3    VARCHAR2(50);
    STATUS1     NUMBER;
    STATUS2     NUMBER;
    STATUS3     NUMBER;
BEGIN
    --REGISTERING 3 PROCESSES FOR THREE DIFFERENT PROCEDURES
    DBMS_ALERT.REGISTER('PROCESS1');
    DBMS_ALERT.REGISTER('PROCESS2');
    DBMS_ALERT.REGISTER('PROCESS3');
    -- SUBMITTING THE PROCEDURES FOR EXECUTION
    -- IT WILL BE EXECUTED IN THE BACKGROUND
    DBMS_JOB.SUBMIT(LV_JOB_NO, 'OneSP; DBMS_ALERT.SIGNAL(''PROCESS1'',''COMPLETED''); COMMIT;');
    DBMS_JOB.SUBMIT(LV_JOB_NO, 'TwoSP; DBMS_ALERT.SIGNAL(''PROCESS2'',''COMPLETED''); COMMIT;');
    DBMS_JOB.SUBMIT(LV_JOB_NO, 'ThreeSP; DBMS_ALERT.SIGNAL(''PROCESS3'',''COMPLETED''); COMMIT;');
    -- WAITING FOR THE BACKGROUND PROCESS TO COMPLETE AND FETCHING THE SIGNAL OF COMPLETED FROM THEM
    DBMS_ALERT.WAITONE('PROCESS1', MESSAGE1, STATUS1);
    DBMS_ALERT.WAITONE('PROCESS2', MESSAGE2, STATUS2);
    DBMS_ALERT.WAITONE('PROCESS3', MESSAGE2, STATUS3);
    -- IF ALL THE PROCEDURES ARE COMPLETED THEN ONLY EXECUTE THE ENDSTOREDPROCEDURE
    IF STATUS1 = 0 AND STATUS2 = 0 AND STATUS3 = 0 THEN
        ENDSTOREDPROCEDURE;
    END IF;
END;
/

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...