Реализация многопоточности в процедурах Oracle - PullRequest
4 голосов
/ 21 ноября 2011

Я работаю над Oracle 10gR2.

И вот моя проблема -

У меня есть процедура, давайте ее назовем * proc_parent * (внутри пакета)который должен вызывать другую процедуру, давайте вызовем ее * user_creation *.Я должен вызвать * user_creation * внутри цикла, который читает некоторые столбцы из таблицы - и эти значения столбцов передаются в качестве параметров в процедуру * user_creation *.

Код выглядит следующим образом:

FOR i IN (SELECT    community_id,
                        password,
                        username 
               FROM     customer 
               WHERE    community_id IS NOT NULL 
               AND      created_by = 'SRC_GLOB'
              )
     LOOP
        user_creation (i.community_id,i.password,i.username);
     END LOOP;

COMMIT;

Процедура user_Creation вызывает веб-службу для некоторой бизнес-логики, а затем на основе ответа обновляет таблицу.

Мне нужно найти способ, с помощью которого я могу использовать здесь многопоточность, чтобы я мог запускать несколько экземпляров этой процедуры, чтобы ускорить процесс.Я знаю, что могу использовать * DBMS_SCHEDULER * и, вероятно, * DBMS_ALERT *, но я не могу понять, как использовать их внутри цикла.

Может кто-товести меня в правильном направлении?

Спасибо, Анкур

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

что вы можете сделать, это отправить много заданий одновременно. См. Пример 28-2. Создание набора облегченных заданий в одной транзакции

Это заполняет таблицу pl / sql всеми заданиями, которые вы хотите отправить в один раз, все одновременно. Как только они отправлены (включены), они начнут работать столько, сколько может обработать система, или столько, сколько разрешено планом менеджера ресурсов.

Издержки, которые имеют легкие задания, очень ... минимальны / легки.

1 голос
/ 05 июня 2012

Я хотел бы закрыть этот вопрос. DBMS_SCHEDULER, а также DBMS_JOB (хотя DBMS_SCHEDULER предпочтительнее) могут использоваться внутри цикла для отправки и выполнения задания.

Например, вот пример кода с использованием DBMS_JOB, который может быть вызван внутри цикла:

...
FOR i IN (SELECT community_id,
                 password,
                 username
          FROM   customer
          WHERE  community_id IS NOT NULL
          AND    created_by = 'SRC_GLOB'
         )
LOOP
DBMS_JOB.SUBMIT(JOB => jobnum,
                WHAT => 'BEGIN user_creation (i.community_id,i.password,i.username); END;'      
COMMIT;
END LOOP;   

Использование коммита после SUBMIT запускает задание (и, следовательно, процедуру) параллельно.

...