Как я могу заставить процедуру ждать, пока не будет выполнено определенное условие, чтобы продолжить работу с кодом?

#oracle #opc

#Oracle #opc

Вопрос:

Я работаю над OPC-клиентом. Этот клиент вызывает процедуру, которая, в свою очередь, вставляет несколько строк в одну таблицу «очереди».

У этого клиента также есть другой поток, который время от времени открывает таблицу «очередь» и обновляет значения элементов OPC на основе элементов в таблице. После обновления каждого значения поток очищает строку из таблицы «очередь».

Я хочу: я вызываю процедуру, она вставляет значения в очередь и ждет, пока другой поток не очистит вставленные значения, чтобы сделать что-то еще.

Возможно ли это каким-либо образом? На других языках я бы подумал об использовании чего-то вроде цикла while с Sleep()s, проверяя, были ли строки очищены, пока он не выйдет из цикла.

Спасибо за любую информацию

-Редактировать:

Я попытаюсь прояснить немного больше:

Допустим, существует 3 разных типа заданий: «ВСТАВКА», «ОБНОВЛЕНИЕ» и «ОКОНЧАТЕЛЬНАЯ ОБРАБОТКА».

У меня может быть много разных заданий типа «ВСТАВИТЬ», каждое из которых вставляется в очередь со своим уникальным идентификатором:

 Insert (ID=1, OPCTag=1)
Insert (ID=1, OPCTag=2)
Insert (ID=1, OPCTag=3)

Insert (ID=2, OPCTag=1)
Insert (ID=2, OPCTag=2)
Insert (ID=2, OPCTag=3)
  

Существует только одно задание «ОБНОВИТЬ», постоянно считывающее и очищающее очередь.

Я застрял в части «ОКОНЧАТЕЛЬНОЙ ОБРАБОТКИ», поскольку у меня тоже будет несколько заданий такого типа, как и «ВСТАВИТЬ».

Я не знаю, как запустить правильное задание «ОКОНЧАТЕЛЬНОЙ ОБРАБОТКИ», которое связано с «ИДЕНТИФИКАТОРОМ ВСТАВКИ», после того, как все строки с этим идентификатором ВСТАВКИ были очищены «ОБНОВЛЕНИЕМ».

Скажем, мое задание «ОБНОВИТЬ» очистило все строки с «ID = 1». Когда последняя строка с ID = 1 очищена, мне нужно запустить процедуру с именем FinalProcessingID1 . То же самое, когда ID = 2 все очищено.

Комментарии:

1. Вы могли бы использовать dbms_lock.sleep , но я немного опасаюсь вашего подхода. Что делать, если клиент неожиданно умирает? Из вашей таблицы очередей ничего не выйдет из очереди. Oracle встроила очередь, будет ли это работать для вашего приложения?

2. У Eaolson правильная идея. Здесь у вас должно быть 3 задания: одно для вставки, одно для обновления и одно для окончательной обработки. В идеале использование (или нескольких) очереди сообщений (например, oracle AQ) или таблицы «queue» будет хорошо работать с опросом.