【问题标题】:Oracle SQL Query to retrieve specific Event using specific condition in xpath?Oracle SQL Query 使用 xpath 中的特定条件检索特定事件?
【发布时间】:2017-02-17 22:06:04
【问题描述】:
<List>
   <Event>
      <eventTime>2016-08-03T15:41:12.000+05:30</eventTime>
      <e:PlaceHolder xmlns:e="http://dpmt.element.com">US</e:PlaceHolder>
      <e:flag xmlns:e="http://dpmt.rmg.org/pq/rs">true</e:flag>
      <e:flag1 xmlns:e="http://dpmt.rmg.org/pq/rs">false</e:flag1>
   </Event>
   <Event>
      <eventTime>2016-08-01T19:41:12.000+05:30</eventTime>
   </Event>
</List>

我以这种方式存储了我的 XML 文档,其中可能包含多个 &lt;Event&gt; 标记,使用 X-Path 查询,我只想获取该事件,其 e:flag 值为 true,在我的情况下,我必须使用 where 子句仅获取第一个事件标签。我需要在 where 子句中按条件使用 EXTRACT 或 ExtractValue 函数的通用查询来检查其标志值。

我是这样写查询的:-

选择 * FROM (SELECT EXTRACT(doc,'//List').getClobVal() AS doc FROM my_table) T;

【问题讨论】:

    标签: sql xml oracle xpath xml-parsing


    【解决方案1】:

    这对你有帮助;使用空值测试标志标记。应该在函数中添加另一个值。

     DECLARE
    vs_Xml VARCHAR2(32000):= '<List>
      <Event>
        <eventTime>2016-08-03T15:41:12.000+05:30</eventTime>
        <e:PlaceHolder xmlns:e="http://dpmt.element.com">US</e:PlaceHolder>
        <e:flag xmlns:e="http://dpmt.rmg.org/pq/rs">true</e:flag>
        <e:flag1 xmlns:e="http://dpmt.rmg.org/pq/rs">false</e:flag1>
    </Event>
       <Event>
         <eventTime>2016-08-01T19:41:12.000+05:30</eventTime>
       </Event>
    </List>';
    
    vx_ParameterList   XMLTYPE;
    vx_Parameter       XMLTYPE;
    vn_ParameterIndex  NUMBER;
    vs_Key             VARCHAR2(64);
    vs_XPath           VARCHAR2(255);
    vs_Value           VARCHAR2(10000);
    vs_Value2           VARCHAR2(10000);
    
    BEGIN
       vx_ParameterList := xmltype(vs_Xml);
       vn_ParameterIndex := 1;
       vs_XPath := '/List/Event'; 
    
    WHILE vx_ParameterList.existsNode(vs_XPath || '[' || vn_ParameterIndex || ']') = 1 LOOP
      vx_Parameter := vx_ParameterList.extract(vs_XPath || '[' || vn_ParameterIndex || ']');
    
      vs_Value := vx_Parameter.extract('//eventTime/text()').GetStringVal(); 
    
      SELECT  vx_Parameter.extract('//flag/text()', 'xmlns:e="http://dpmt.rmg.org/pq/rs"').GetStringVal() INTO  vs_Value2  FROM DUAL; --Null value handling
      vn_ParameterIndex := vn_ParameterIndex + 1;
    
      dbms_output.put_line(vs_Value ||'-' || vs_Value2);
    END LOOP;
    
     END;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2013-03-03
      相关资源
      最近更新 更多