【问题标题】:Issue with creating XMLQuery for given XPATH为给定 XPATH 创建 XMLQuery 的问题
【发布时间】:2013-09-03 22:54:05
【问题描述】:

我有一个表,其中有一列作为 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>

我有使用“提取”的查询来打印以下输出:

SELECT     extract(o.Order_desc,'/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[0]/@Ordername').getStringVal() "Node1",
    extract(o.Order_desc,'/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[0]/OrderVals/OrderVal[1]/listvalue/text()').getStringVal() "Node1Child",
    extract(o.Order_desc,'/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[1]/@Ordername').getStringVal() "Node2",
    extract(c.Order_desc,'/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/listvalue/text()').getStringVal() "Node2Child"
   FROM Orders o;

   OUTPUT:-               
   Node2_Child1
   Node2_Child1_OrderValue_1
   Node2_Child2
   Node2_Child2_OrderValue_1

我想使用 XMLQuery 实现相同的输出,但我无法构建查询来打印子节点。到目前为止,我只能使用 XMLQuery 打印节点值,如下所示:-

SELECT XMLQuery(            '/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[0]/@Ordername'
             PASSING o.Order_desc RETURNING CONTENT
           )
 FROM Orders o;

如何使用“extract”和“XMLQuery”实现相同的输出?

谢谢。

/******** 修改后的查询运行:-

SELECT XMLQuery('//OrderVal/Orderattrs/Orderattr/(@Ordername,   OrderVals/OrderVal/listvalue)/data(.)'
             PASSING o.Order_desc RETURNING CONTENT
           )
 FROM Orders o;

输出:-

Node2_Child1
Node2_Child1_OrderValue_1
Node2_Child

使用 XMLTABLE 获取所有节点及其子节点。

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

如何使用 XMLQuery 达到同样的效果??

【问题讨论】:

    标签: sql xml oracle xpath xmltype


    【解决方案1】:

    您的查询和示例 XML 似乎不匹配,因此我尽可能与您的查询保持一致。由于您的 XML 已损坏,您可能还需要调整一些轴步长。

    您可以使用括号在某个点“分支”(例如获取属性值和子节点)。此查询将一次获取任意数量的订单属性的所有结果:

    //OrderVal/Orderattrs/Orderattr/(@Ordername, OrderVals/OrderVal/listvalue)/data(.)
    

    【讨论】:

    • 我已经编辑了XML,你可以看看。我尝试在 cmets 上执行我的查询,但得到“无行”输出。
    • 根据您的建议修改了查询并将输出粘贴到我的“问题”部分...请参见上文。输出被截断...任何线索为什么会发生?还有“data(.)”对 XMLQuery 有什么作用??
    • 不知道为什么会被截断,只有很少的 Oracle DB 经验。 data(.)返回当前项的数据(属性值/拼接文本节点)。
    • 任何人都可以解释一下为什么我在运行修改后的查询时会被截断输出?
    • 所以你能解决它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多