【问题标题】:Oracle clob read value of a field paramaterOracle clob 读取某个字段参数的值
【发布时间】:2013-09-09 18:48:38
【问题描述】:

我有一个如下所示的 xml。有许多节点 b4 和之后,但它们是无关紧要的。

<Parent>
    <ServiceTag>sometag</ServiceTag>
    <Addl_Payloads>
    <Addl_PayloadCount>1</Addl_PayloadCount>
        <Addl_Payload>
            <Attrib Name="TYPE" Seq="1" Value="LICENSE"> </Attrib>
            <Attrib Name="ENTITLEMENT_ID" Value="sdfsfdsadfaasdfsadf1"></Attrib>
     </Addl_Payloads>
</Parent>

如何在 Oracle 11g 中构建查询以仅在存在 Attrib name=ENTITLEMENT_ID 时读取值。我尝试了类似的方法,但这使我的值列为空 基本上我想read = 'sdfsfdsadfaasdfsadf1'如果它存在

SELECT s.doc_id,
       extractValue(x.column_value, '/Parent/ServiceTag') as ST,
       extractValue(x.column_value, 
                   '/Parent/Addl_Payloads/Addl_Payload/Attrib[@Name="ENTITLEMENT_ID"]') as Value
 from LKMLOG.LKM_ORIG_ASB_MSG s
    , TABLE(
            XMLSequence(
                        xmltype( s.ASB_XML).extract(
                           '//Payload/PPIDInfoRequestMessage/PPIDData/Parent'
                            )
                       )  
         ) x
where  s.doc_id in (somevalues);

【问题讨论】:

    标签: xml oracle oracle11g clob extract-value


    【解决方案1】:

    如果你想提取,如果我理解正确的话,Values 只有当节点的Name 属性等于"ENTITLEMENT_ID" 时,你可以这样做:

    with t1(xml_col) as(
       select xmltype('
          <Addl_Payloads>
               <Addl_PayloadCount>1</Addl_PayloadCount>
               <Addl_Payload>
                  <Attrib Name="TYPE" Seq="1" Value="LICENSE"> </Attrib>
                  <Attrib Name="ENTITLEMENT_ID" Value="sdfsfdsadfaasdfsadf1"> </Attrib>
               </Addl_Payload>
           </Addl_Payloads>') from dual
      )
      select val
        from t1 t
        cross join xmltable('/Addl_Payloads/Addl_Payload/Attrib[@Name="ENTITLEMENT_ID"]'
                            passing t.xml_col
                            columns val varchar2(101) path '@Value')
    

    结果:

     VAL
     -----------------------
     sdfsfdsadfaasdfsadf1
    

    SqlFiddle Demo

    注意:从 Oracle 11gr2 开始,XMLSequence 函数已被弃用 - 仍然存在以实现向后兼容性。


    附录

    为了包含&lt;ServiceTag&gt; 的值,可以通过以下方式更改上述查询:

    with t1(xml_col) as(
       select xmltype('
          <Parent>
            <ServiceTag>sometag</ServiceTag>
            <Addl_Payloads>
                 <Addl_PayloadCount>1</Addl_PayloadCount>
                 <Addl_Payload>
                    <Attrib Name="TYPE" Seq="1" Value="LICENSE"> </Attrib>
                    <Attrib Name="ENTITLEMENT_ID" Value="sdfsfdsadfaasdfsadf1"> </Attrib>
                    <Attrib Name="ENTITLEMENT_ID" Value="another_eaxmple"> </Attrib> 
                 </Addl_Payload>
             </Addl_Payloads>
          </Parent>') from dual
      )
      select q.ST
           , s.val
        from t1 t
        left join xmltable('/Parent/ServiceTag'
                            passing t.xml_col
                            columns ST varchar2(101) path '.') q
         on (1=1)    
        left join xmltable('/Parent/Addl_Payloads/Addl_Payload/Attrib[@Name="ENTITLEMENT_ID"]'
                            passing t.xml_col
                            columns val varchar2(101) path '@Value') s
          on (1=1)
    

    结果:

    ST            Val 
    --------------------------
    sometag       sdfsfdsadfaasdfsadf1 
    sometag       another_eaxmple 
    

    SqlFiddle Demo

    【讨论】:

    • Nicholas - 感谢您的快速响应...我是 Oracle XML 新手,因此可能没有提供所有信息。 XML 是一个 clob(一个巨大的 XML),你对我想要得到的东西是绝对正确的。只有在 Name="ENTITLEMENT_ID" 时,我才想从 中“取值”,因为 XML 很大并且我正在处理多行。我可以在我粘贴的格式内做些什么吗?
    • @RaoLinMau is there something I can do within the format of what I pasted 我不确定我是否在关注。我们在谈论什么格式?请编辑您的问题以增加清晰度。
    • 我在原始 XML 中添加了 .. 如果 name=entitlement_id ST = sometag 和 value=sdfsfdsadfaasdfsadf1,我需要服务标签和属性值
    猜你喜欢
    • 2014-04-01
    • 2023-03-09
    • 1970-01-01
    • 2021-12-09
    • 2015-03-02
    • 2013-07-31
    • 1970-01-01
    • 2015-12-21
    • 2017-06-14
    相关资源
    最近更新 更多