结构化XMLIndex在创建时给出错误

时间:2013-09-02 16:37:25

标签: xml oracle oracle11g xmltype xmlindex

我有一个表,其中一列作为XMLTYPE与Object-Relational存储一起存储。下面是表格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包含大约2500个Node2 Orderattr值。使用以下查询使用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

...谢谢

1 个答案:

答案 0 :(得分:1)

您需要在XQuery表达式的末尾添加一个带有position() Xpath函数的条件:

...
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格式不正确。

Last:在您的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