Oracle Advance Queue - условие ожидания не работает - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь удалить сообщение с определенным приоритетом, используя deq_condition (в Oracle Advance Queue), но всегда не получаю сообщения.Я пробовал следующее:

  dequeue_options.deq_condition := 'tab.priority = 10'; 
  dequeue_options.deq_condition := 'priority = 10'; 

Я также пытался вернуть истинное условие, подобное этому:

  dequeue_options.deq_condition := '1 = 1'; 

, но всегда не получал сообщения, и если я удаляю это условие, то яполучить сообщение в очереди.есть идеи?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Простая проверка, если в очереди есть сообщение с заданным приоритетом.Замените aqtab на имя таблицы очередей

 select * from aqtab where priority = 10 order by ENQ_TIME;

Очень вероятно, что вы не увидите сообщений, поскольку это условие priority = 10 просто добавляется в запрос, выполняющий очередь.

Примечаниедля того, чтобы установить приоритет сообщения, вы используете свойства сообщения

 l_message_properties dbms_aq.message_properties_t;

Просто назначьте необходимый приоритет ...

 l_message_properties.priority := 10;

... и передайте свойства в качестве параметра DBMS_AQ.enqueue

После commit вы должны увидеть сообщение в таблице очередей, используя указанный выше запрос, и вы сможете удалить из очереди с помощью deq_condition

0 голосов
/ 26 февраля 2019

Обе версии верны
dequeue_options.deq_condition := 'priority = 10';
dequeue_options.deq_condition := 'tab.priority = 10';

Но если вы используете условие deq, вам следует позаботиться о параметре navigation.Самый простой вариант - повторить операцию удаления очереди после появления исключения.(снимок очереди будет сброшен).

или добавить dequeue_options.navigation := DBMS_AQ.FIRST_MESSAGE;.

...