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>
如果您打算使用 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)
);
虽然您无法像当前查询那样将其结果作为查询结果的一部分。
您需要将命名空间添加到 existsNode 函数中:
SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe', 'xmlns="http://www.fazenda.sp.gov.br/sat"') HAS, XML_DATA FROM XML_TEMP;
我在 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>
如果您打算使用 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)
);
虽然您无法像当前查询那样将其结果作为查询结果的一部分。
您需要将命名空间添加到 existsNode 函数中:
SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe', 'xmlns="http://www.fazenda.sp.gov.br/sat"') HAS, XML_DATA FROM XML_TEMP;