0

我有一个表,其中一列作为 XMLTYPE 与对象关系存储一起存储。下面是表 ddl。

CREATE TABLE Orders ( Order_id number not null,
                  Order_status Varchar2(100),
                  Order_desc XMLType not null )
                  XMLTYPE Order_desc STORE AS OBJECT RELATIONAL
                  XMLSCHEMA "http://localhost/public/xsd/Orderstore.xsd"
                  ELEMENT "OrderVal";

我已成功注册架构以使用 XML DB 加载 XSD。下面是加载到 XMLTYPE 列中的 XML。

<?xml version="1.0" encoding="utf-8" ?>
<draftorders>
<OrderSumm>
   <Ordercod>OrderBookings</Ordercod>
</OrderSumm>
<Orderattrs>
 <Orderattr Ordername="HROrder">
    <OrderVals>
        <OrderVal>
             <listvalue>Order1</listvalue>
             <Orderattrs>
                  <Orderattr Ordername="Node1_Child1">
                     <OrderVals>
                         <OrderVal>
                              <listvalue><![CDATA[ Node1_Child1_OrderValue_1]]></listvalue>
                              <Orderattrs>
                                   <Orderattr Ordername="Node2_Child1">
                                        <OrderVals>
                                             <OrderVal>
                                                  <listvalue><![CDATA[ Node2_Child1_OrderValue_1]]></listvalue>
                                             </OrderVal>
                                        </OrderVals>
                                   </Orderattr>
                                   <Orderattr Ordername="Node2_Child2">
                                       <OrderVals>
                                            <OrderVal>
                                                  <listvalue><![CDATA[ Node2_Child2_OrderValue_1]]></listvalue>
                                            </OrderVal>
                                       </OrderVals>
                                   </Orderattr>
                              </Orderattrs>
                         </OrderVal>
                     </OrderVals>
                  </Orderattr>
             </Orderattrs>
        </OrderVal>
    </OrderVals>
 </Orderattr>
 </Orderattrs>
 </draftorders>

此 XML 包含 Node2 Orderattr 的大约 2500 个值。我正在使用以下查询使用 XMLTABLE 一次性打印出所有 Node2 值。

SELECT ord.OrdName, ord.OrdVal
FROM Orders,  XMLTable('/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr'
                     PASSING Order_desc
                     COLUMNS "OrdName"   VARCHAR2(4000) PATH '@Ordername',
                             "OrdVal"    VARCHAR2(4000) PATH  'OrderVals/OrderVal[1]/listvalue') ord;

输出:-

Node2_Child1
Node2_Child1_OrderValue_1
Node2_Child2
Node2_Child2_OrderValue_1
......
Node2_Child2500
Node2_Child2500_OrderValue_1

现在我想将我的结果集限制为仅前 25 个 Node2 Orderattr 值,而不是整个集合。我应该如何将结果集限制为仅前 25 个节点值。

能够使用 XMLTable 获取它。

我尝试使用 XMLQuery 函数来实现与上述相同的输出,但接收到截断的输出。

SELECT XMLQuery(            '/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr/(@listname, OrderVals/OrderVal/listvalue/text())'
PASSING o.Order_desc RETURNING CONTENT)
FROM Orders o;

输出:- Node2_Child1Node2_Child1_OrderValue_1Node2_Child2Node2_Child2_OrderValue_1Node2_Child3Node2_Child3_OrderValue_1Node2_Child4Node2_Child4_OrderValue_1Node2_Child5Node2_Child5_OrderValue_1........Node2_Child25Node2_Child25_OrderValue_1

谢谢...

4

1 回答 1

1

您需要使用position()Xpath 函数将条件添加到 XQuery 表达式的末尾:

...
XMLTable(
  '/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[position() <= 25]'
...

SQLFiddle test with your exapmle

更新

问题已更新,因此有关功能的更多信息XMLQuery()。首先,此函数返回单个 XMLType,因此要获取单个元素,您需要使用ExtractValue()函数:

with params as (
  select XMLParse(content '
  <draftorders>
   <!-- EXAMPLE XML FROM QUESTION GOES HERE -->
 </draftorders>
  ')
  doc from dual
)
select 
  ExtractValue(xml_val, '/Orderattr/@Ordername') order_name,
  ExtractValue(xml_val, '/Orderattr/OrderVals/OrderVal[1]/listvalue') list_value
from (
  SELECT 
    XMLQuery(
      '//OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[position() < 2]'
      PASSING doc returning content
    ) xml_val
  from 
    params
);  

SQLFiddle test for XMLQuery variant

第二:如果您的 XQuery 返回节点集,则生成的 XML 格式不正确,因为没有单个根节点。

最后:在您的带有 XMLQuery 表达式的变体中,返回一组值,而不是 XML。XQuery 中的所有值序列都连接在一起,没有分隔符,所以你得到了你所得到的:

Node2_Child1<![CDATA[ Node2_Child1_OrderValue_1]]>Node2_Child2<![CDATA[ Node2_Child2_OrderValue_1]]>

在评估后,这个表达式被翻译成

Node2_Child1Node2_Child1_OrderValue_1Node2_Child2Node2_Child2_OrderValue_1

糟糕...您输入错误@Ordername并将其更改@listname为至少有问题的文本,因此这部分返回空字符串,如果此表达式在没有更改的情况下进行评估,结果将类似于

Node2_Child1_OrderValue_1Node2_Child2_OrderValue_1
于 2013-09-03T12:02:19.453 回答