ExistsNode - 怎么了

ExistsNode - What's wrong

我在 oracle 中创建一个 table 是这样的:

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>
                                  ');

当我select existsNode return 0

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

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

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

您的根节点有一个命名空间,因此您需要使用 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

虽然您无法像当前查询那样将其结果作为查询结果的一部分。

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

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