Здесь есть две проблемы, поэтому давайте рассмотрим их по отдельности:
Как разделить некоторую работу между несколькими потоками / сеансами?
Вы можете использовать расширенную очередь или функцию SKIP LOCKED в, предложенный Адамом .
Вы также можете использовать столбец, содержащий информацию об обработке, например столбец STATE, который пуст, когда не обработан.Каждый поток будет начинать работу над строкой с:
UPDATE your_table
SET state='P'
WHERE STATE IS NULL
AND rownum = 1
RETURNING id INTO :id;
В этот момент поток выполнит фиксацию для предотвращения блокировки другого потока.Затем вы выполняете свою обработку и выбираете другую строку, когда закончите.
В качестве альтернативы, вы также можете заранее разбить работу и назначить каждому процессу диапазон идентификаторов, которые необходимо обработать.
Как временные таблицы будут вести себя с несколькими потоками?
Скорее всего, у каждого потока будет свой сеанс Oracle (иначе вы не могли бы выполнять запросы параллельно).Это означает, что каждый поток будет иметь свою собственную виртуальную копию временной таблицы.Если вы предварительно сохранили данные в этой таблице, потоки не смогут их увидеть (временная таблица всегда будет пустой в начале сеанса).
Вам понадобятся обычные таблицы, если вы хотите сохранитьданные доступны для нескольких сеансов.Временные таблицы хороши для хранения данных, которые являются частными для одного сеанса, например, промежуточных данных в сложном процессе.