在 XMLTABLE (Oracle) 中使用 xmlnamesspaces 子句

Using xmlnamesspaces clause in XMLTABLE (Oracle)

我一直在努力让 XMLTABLE 正常工作,并且一直在查看类似的帖子,但仍然遇到问题。查询有效,但我没有得到返回值,而且我不明白为什么。

XML是:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CstmrPmtStsRpt>
    <GrpHdr>
      <MsgId>185079144aba70c2b</MsgId>
      <CreDtTm>2014-03-10T11:01:18.893Z</CreDtTm>
      <InitgPty>
        <Id>
          <OrgId>
            <BICOrBEI>BARCGB22</BICOrBEI>
          </OrgId>
        </Id>
      </InitgPty>
    </GrpHdr>
    <OrgnlGrpInfAndSts>
      <OrgnlMsgId>AG00411310_1</OrgnlMsgId> 
      <OrgnlMsgNmId>pain.001.001.03</OrgnlMsgNmId>
      <OrgnlNbOfTxs>1</OrgnlNbOfTxs>
      <OrgnlCtrlSum>1234.56</OrgnlCtrlSum>
      <GrpSts>ACCP</GrpSts>
    </OrgnlGrpInfAndSts>
    <OrgnlPmtInfAndSts>
      <OrgnlPmtInfId>AG00411310</OrgnlPmtInfId>
      <OrgnlNbOfTxs>1</OrgnlNbOfTxs>
      <OrgnlCtrlSum>1234.56</OrgnlCtrlSum>
      <PmtInfSts>ACCP</PmtInfSts>
      <TxInfAndSts>
        <OrgnlEndToEndId>AG700060000007</OrgnlEndToEndId>
        <TxSts>ACCP</TxSts>
        <OrgnlTxRef>
          <Amt>
            <InstdAmt Ccy="GBP">1234.56</InstdAmt>
          </Amt>
          <ReqdExctnDt>2014-03-06</ReqdExctnDt>
        </OrgnlTxRef>
      </TxInfAndSts>
    </OrgnlPmtInfAndSts>
  </CstmrPmtStsRpt>
</Document>

我已经将 XML 加载到 table 中的 XMLTYPE 列中,我正在使用它进行称为 doctest 的基本测试(xml 在有效负载列中) .我的 sql 查询如下:

select ackd.BICorBIE
from doctest,
XMLTABLE(xmlnamespaces ('urn:iso:std:iso:20022:tech:xsd:pain.002.001.03' as "b"),
'/b:Document' 
PASSING payload
COLUMNS
BICorBIE varchar2(20) PATH 'b:CstmrPmtStsRpt/GrpHdr/InitgPty/Id/OrgId/BICOrBEI') ackd;

查询执行无误,但该列为 NULL。

您的 XML 声明了一个命名空间,但 none 节点明确使用它,因此您的 XPath 也不需要。因此,您可以在语句中将其声明为 default 命名空间,而不是使用标识符:

select ackd.bicorbie
from doctest
cross join xmltable (
  xmlnamespaces (default 'urn:iso:std:iso:20022:tech:xsd:pain.002.001.03'),
  '/Document' 
  passing payload
  columns
    bicorbie varchar2(20) path 'CstmrPmtStsRpt/GrpHdr/InitgPty/Id/OrgId/BICOrBEI'
) ackd;

BICORBIE            
--------------------
BARCGB22

如果需要,您可以仍然将其声明为"b",但是您必须将其作为每个节点的前缀包含在内:

select ackd.bicorbie
from doctest
cross join xmltable(
  xmlnamespaces ('urn:iso:std:iso:20022:tech:xsd:pain.002.001.03' as "b"),
  '/b:Document' 
  passing payload
  columns
    bicorbie varchar2(20) path 'b:CstmrPmtStsRpt/b:GrpHdr/b:InitgPty/b:Id/b:OrgId/b:BICOrBEI'
) ackd;

BICORBIE            
--------------------
BARCGB22

这里使用默认值更简单。