【问题标题】:ExistsNode - What's wrongExistsNode - 怎么了
【发布时间】:2017-11-21 18:17:57
【问题描述】:

我在 oracle 中这样创建一个表:

CREATE TABLE XML_TEMP (
          XML_DATA CLOB
);

INSERT INTO XML_TEMP(XML_DATA) VALUES('
    <envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat">
        <tpAmb>1</tpAmb>
        <idLote>4095</idLote>
        <cUF>35</cUF>
        <LoteCFe>    
        </LoteCFe>
        <nSeg></nSeg>
        <dhEnvio>20171101101517</dhEnvio>
    </envCFe>
                                  ');

当我选择 existsNode 时返回 0

SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe') HAS, XML_DATA FROM XML_TEMP;

我不明白出了什么问题,有人可以帮忙。

链接http://sqlfiddle.com/#!4/c2b9e/5/0 有SQLFiddle

【问题讨论】:

    标签: oracle oracle11g xmltype


    【解决方案1】:

    你的根节点有一个命名空间,所以你需要指定使用the optional third argument

    SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe',
        'xmlns="http://www.fazenda.sp.gov.br/sat"') HAS, XML_DATA
    FROM XML_TEMP;
    
           HAS XML_DATA                                                                        
    ---------- --------------------------------------------------------------------------------
             1                                                                                 
                   <envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat">             
                       <tpAmb>1</tpAmb>                                                        
                       <idLote>4095</idLote>                                                   
                       <cUF>35</cUF>                                                           
                       <LoteCFe>                                                               
                       </LoteCFe>                                                              
                       <nSeg></nSeg>                                                           
                       <dhEnvio>20171101101517</dhEnvio>                                       
                   </envCFe>                                                                   
    

    SQL Fiddle

    如果您打算使用 ExistsNode 过滤结果,并且由于该功能已被弃用,您可以使用 the XMLExists operator 代替该场景:

    SELECT XML_DATA
    FROM XML_TEMP
    WHERE XMLExists(
      'declare namespace ns="http://www.fazenda.sp.gov.br/sat"; (: :)
      /ns:envCFe'
      PASSING XMLTYPE(XML_DATA)
    );
    

    SQL Fiddle

    但是,您无法将其结果作为查询结果的一部分,正如您当前的查询所做的那样。

    【讨论】:

    • 感谢@alex-poole
    【解决方案2】:

    你需要将命名空间添加到existsNode函数中:

    SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe', 'xmlns="http://www.fazenda.sp.gov.br/sat"') HAS, XML_DATA FROM XML_TEMP;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2015-06-29
      • 2012-09-05
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多