在 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
这里使用默认值更简单。
我一直在努力让 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
这里使用默认值更简单。