3

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. 类型 ASO_Line_Var_Type 定义为 VARRAY (1000000000) OF ASO_Line_Type
  3. 并且 ASO_Line_Type 被定义为 OBJECT (accounting_rule_id NUMBER , actual_arrival_date DATE , .... , org_id NUMBER , ....)

我可以这样写条件吗

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

1 回答 1

1

使用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)';
于 2019-10-11T17:33:30.053 回答