PL / SQL ждут обновления в Oracle - PullRequest
1 голос
/ 03 апреля 2011

Как создать функцию PL / SQL, которая ожидает обновления в некоторой строке в течение указанного времени ожидания и затем возвращает.

Что я хочу сделать, так это - у меня давно запущен процесс, который обновит свой статус до таблицы ASYNC_PROCESS по process_id. Мне нужна функция, которая возвращает true / false, когда этот процесс завершен, но также мне нужна эта функция, чтобы некоторое время ждать завершения этого процесса, возврата по таймауту или немедленного возврата с true, когда процесс завершен. Я не хочу использовать сон (1 сек), потому что в этом случае у меня будет задержка в 1 сек. Я не хочу использовать режим сна (1 мсек), потому что в этом случае я трачу ресурсы процессора (и отставание в 1 мсек).

Есть ли хороший способ, как опытный программист достиг бы этого?

Эта функция будет вызываться из .NET (поэтому мне нужно минимальное отставание между работой БД и .NET / UI)

Thnx, Говядина

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Я думаю, что наиболее разумно в этом случае использовать обновление триггеров на этой ASYNC_PROCESS таблице.

Вам также следует заглянуть в пакет DBMS_ALERT. Вот отредактированная выдержка из этого документа:

Создать оповещение:

DBMS_ALERT.REGISTER('emp_table_alert');

Создайте триггер на вашем столе, чтобы активировать оповещение:

CREATE TRIGGER emptrig AFTER INSERT ON emp
BEGIN 
   DBMS_ALERT.SIGNAL('emp_table_alert', 'message_text'); 
END;

Из вашего .net кода вы можете использовать что-то, что вызывает это:

DBMS_ALERT.WAITONE('emp_table_alert', :message, :status, :timeout); 

Обязательно прочитайте документы, чтобы узнать, что :status и :timeout делают.

1 голос
/ 03 апреля 2011

Вы должны посмотреть на Oracle Advanced Queuing . Он предлагает те функции, которые вы ищете.

Возможно, вам понадобится отдельная таблица очередей, в которую триггер на ASYNC_PROCESS вставляет сообщения. Затем вы используете функции AQ для получения (или ожидания) следующего сообщения в таблице очередей.

0 голосов
/ 04 апреля 2011

Если вы делаете это в C # .NET, почему бы вам просто не создать рабочий поток для обновления (через ODAC)?Зачем передавать ответственность Oracle, когда (кажется) вы хотите, чтобы процесс .NET выполнил вызов обновления (в фоновом режиме) и уведомил основной процесс о его завершении.

См. здесь и здесь для примеров, хотя для этого есть несколько подходов в .NET (делегаты, события, асинхронные обратные вызовы, пулы потоков и т. Д.)

...