目前我有一段代码使用oracle高级队列对消息进行入队和出列。
我需要做的是首先检查具有高优先级的消息,然后再获取其他消息。但我似乎无法做到这一点。
以下是我的代码示例:
Public Function GetQMsg(ByRef sMsg, ByRef vMsgId As Variant, Optional lWait As Long = ORAAQ_DQ_NOWAIT) As Long
gobjDB.LastServerErrReset
sMsg = ""
On Error GoTo cmdErr
gobjQ.Wait = lWait ' ORAAQ_DQ_NOWAIT
gobjQ.Navigation = ORAAQ_DQ_FIRST_MSG ' to refresh snapshot of msgs waiting
'gobjQ.DequeueMode = ORAAQ_DQ_BROWSE
vMsgId = gobjQ.Dequeue()
sMsg = gobjMsg.Value
GetQMsg = 0
GoTo Fin
cmdErr:
If gobjDB.LastServerErr = 25228 Then
' no msg available:
GetQMsg = QUEUE_EMPTY
Else
GetQMsg = gobjDB.LastServerErr
End If
Fin:
End Function
如果我在代码中添加以下行,我可以看到msg优先级,但我无法首先查看如何返回优先级最高的消息。
'Debug.Print "Message Priority: " & gobjMsg.Priority
我很欣赏这是使用传统开发,但它是更大应用的基础。
所以我的问题是如何获得按优先顺序返回的消息?
谢谢
答案 0 :(得分:2)
创建队列表时,可以设置参数" sort_list"。
DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'aq.priority_msg',
sort_list => 'PRIORITY desc,ENQ_TIME',
queue_payload_type => 'aq.Message_typ');
队列表将按优先级和enq_time排序。 Dduring deque你将得到最优先的消息。
答案 1 :(得分:1)
在Oracle中创建队列时,会在拥有队列的架构中创建许多视图。您应该能够使用以下内容查询队列的优先级:
SELECT aq.msg_id
FROM aq$queue_table aq
WHERE aq.priority = <your_priority);
然后创建一个使用此查询的游标,您可以修改您的过程以浏览或出列所需的结果。