Обработка строк, как они появляются в таблице в асинхронном процессе может быть сделано несколькими различными способами, выбрать способ, который подходит вам:
Добавить триггер в таблицу, которая создает один -off для обработки строки с использованием DBMS_JOB
. Это подходит, если объем данных, вставленных в таблицу, довольно низок, и вы не хотите, чтобы ваша работа работала все время. Преимущество DBMS_JOB
заключается в том, что задание не запускается до тех пор, пока вставка не будет выполнена; если он откат, задание также откатывается, поэтому не запускается. Недостаток заключается в том, что если есть устойчивый всплеск активности, все созданные задания будут вытеснять любые другие выполняемые задания.
Создайте одно задание, используя DBMS_SCHEDULER
, который работает регулярно, опроса таблицы для новых записей и обрабатывает их. Для этого метода потребуется столбец таблицы, который он может обновить, чтобы отметить каждую запись как «обработанную». Например, добавьте флаг VARCHAR2(1)
, который установлен в 'Y'
на вставке и установлен в NULL
заданием после обработки. Вы можете добавить индекс к этому флагу, который будет хранить записи только для необработанных строк (поэтому он будет небольшим и быстрым). Этот метод намного эффективнее, особенно для больших объемов данных, поскольку каждый запуск задания может эффективно обрабатывать большие куски данных навалом за раз.
Использование Oracle Advanced Queuing. http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100
Для (1), отдельное задание создается для каждой записи в таблице. Вам не нужно создавать задания. Однако вам нужно следить за ними; если вы не справитесь, вам нужно будет исследовать и повторно запускать вручную.
Для (2) вы просто создаете одно задание и позволяете ему работать регулярно. Если одна запись не удалась, ее можно было бы получить на следующей итерации задания. Я обрабатывал каждую запись в отдельной транзакции, поэтому сбой одной записи не влияет на сбой других записей, все еще находящихся в очереди.
Для (3) вы все равно создаете задание типа (2), но вместо чтения таблицы оно вытаскивает запросы из очереди.
Замки, как для создания задания планировщика, для выполнения вашей работы только один раз (или изредка). Это не цель задания планировщика. Цель состоит в том, чтобы регулярно выполнять задание. –
Это примерно 60 000-й вопрос оракула :) –
@Wernfried: Я регулярно использую 'dbms_scheduler' для запуска задания только один раз в фоновом режиме, чтобы я мог отключить/закрыть мой SQL-клиент и не нужно ждать результат длительной операции. –