在 Oracle 中,我们如何在 dbms_aq.dequeue 中有条件地出列数据

in Oracle, how can we dequeue data conditionally in dbms_aq.dequeue

Oracle 数据库为 11g。我的问题与 Oracle APPS ERP 有关。

我们正在使用 dbms_aq.dequeue 使销售订单出列。问题是,所有销售订单行都已出队。我们想设置一个条件,即 dbms_aq.dequeue 应该只使 ORG_ID 为 82 的销售订单行出队。

这是 Oracle 中的标准包 ASO_ORDER_FEEDBACK_GET_PVT。

声明

l_message SYSTEM.ASO_Order_Feedback_Type;

代码

dbms_aq.dequeue(queue_name => l_queue_name,
                dequeue_options => l_dequeue_options,
                message_properties => l_message_properties,
                payload => l_message,
                msgid => l_msg_id);

现在,SYSTEM.ASO_Order_Feedback_Type 由许多其他类型组成,即 header_type ASO_Header_Type、line_varray ASO_Line_Var_Type 等

假设,如果我想设置一个条件以从 header_type 中有条件地检索行,我可以在调用 dbms_aq.dequeue

之前设置以下条件
l_dequeue_options.deq_condition := 'tab.user_data.header_type.org_id=99';

但我不知道如何设置条件以从 line_varray 中有条件地检索行,因为

  1. line_varray 属于 ASO_Line_Var_Type
  2. type ASO_Line_Var_Type 被定义为 VARRAY ( 1000000000 ) OF ASO_Line_Type
  3. 和 ASO_Line_Type 被定义为对象(accounting_rule_id NUMBER,actual_arrival_date DATE,....,org_id NUMBER,....)

条件可以这样写吗

l_dequeue_options.deq_condition := 'tab.user_data.line_varray.org_id=99';

使用 TABLEEXISTS 运算符。

l_dequeue_options.deq_condition := 'EXISTS(
      SELECT 1 FROM
      TABLE(CAST(tab.user_data.line_varray AS SYSTEM.ASO_Line_Var_Type)) e
      WHERE e.org_id = 99)';