Использование предложения xmlnamesspaces в XMLTABLE (Oracle) - PullRequest
0 голосов
/ 19 июня 2020

Я пытался заставить 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 в столбец XMLTYPE в таблице, которую я использую для базового c тестирования, называемого doctest (xml находится в столбце payload). Мой 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.

1 Ответ

0 голосов
/ 19 июня 2020

Ваш XML объявляет пространство имен, но ни один из узлов не использует его явно, поэтому вашему XPath это тоже не нужно. Таким образом, вы можете объявить его в своем операторе как пространство имен по умолчанию , а не с идентификатором:

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

Здесь проще использовать значение по умолчанию.

...