我是Oracle的新手,我在从DB文件表的 CLOG 字段内的XML文档中提取特定字段时遇到以下问题。
所以,在我的XML中,我有这个结构:
<?xml version="1.0" encoding="UTF-8"?>
<in:Invoice xmlns:in="urn:oasis:.....">
<cac:AccountingSupplierParty>
<cac:Party>
.............................
.............................
/* FIRST cac:PartyLegalEntity that contains a cbc:CompanyID element */
<cac:PartyLegalEntity>
<cbc:CompanyID>VALUE-1</cbc:CompanyID>
.............................
.............................
</cac:RegistrationAddress>
</cac:PartyLegalEntity>
/* SECOND cac:PartyLegalEntity that contains a cbc:CompanyID element */
<cac:PartyLegalEntity>
<cbc:CompanyID>VALUE-2</cbc:CompanyID>
.............................
.............................
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
</in:Invoice>
现在进入查询我必须获取 SECOND cac:PartyLegalEntity 元素中 cbc:CompanyID 元素中包含的字符串值( VALUE -2 值)。
我这样做了:
xmltype (d.documento).EXTRACT (
'//cac:AccountingSupplierParty//cac:PartyLegalEntity/cbc:CompanyID/text()')
.getStringVal() AS PIVA_MITTENTE
但是这样做我的查询结果就是 PIVA_MITTENTE 列,其中包含值 VALUE-1VALUE-2 instedad VALUE- 2 这是我想要的。
我认为问题在于 标记(具有相同名称)的容器标记( )是相同的,并且在这些标记中我提取了值相同标签 。
我无法修改XML,因此我可以某种方式指定我希望 SECOND 标记内的 标记的值到我的XML中吗?我该怎么办并解决这个问题?
编辑1:
我的原始查询就是这个:
SELECT
xmltype (d.documento).EXTRACT (
'//cac:AccountingSupplierParty//cac:PartyLegalEntity/cac:RegistrationAddress/cbc:PostalZone/text()')
.getStringVal() AS CAP_MITTENTE,
xmltype (d.documento).EXTRACT (
'//cac:AccountingSupplierParty//cac:PartyLegalEntity/cbc:CompanyID/text()')
.getStringVal() AS PIVA_MITTENTE
FROM coda_tx c, documenti_tx d
WHERE C.FK_TIPO_DOC = 99
AND C.FK_STATO = 1
AND C.FK_PIVA_MITTENTE = '11111111'
AND C.PK_CODA = D.PFK_CODA
AND C.CANALE='STA';
第二个 xmltype(d.documento).EXTRACT 是给我描述问题的那个。
如何将 XMLTABLE 的使用集成到我之前的查询中?
答案 0 :(得分:1)
您需要使用XMLTable功能。您的查询将如下所示:
以下是doc:
的示例SELECT warehouse_name warehouse,
warehouse2."Water", warehouse2."Rail"
FROM warehouses,
XMLTABLE('/Warehouse'
PASSING warehouses.warehouse_spec
COLUMNS
"Water" varchar2(6) PATH '/Warehouse/WaterAccess',
"Rail" varchar2(6) PATH '/Warehouse/RailAccess')
warehouse2;
我相信你可以弄清楚如何通过你的XPATH。
更新: 在你的情况下,它看起来像这样:
SELECT d.*,
x.company_id
FROM d,
XMLTABLE('//cac:AccountingSupplierParty//cac:PartyLegalEntity/'
PASSING d.documento
COLUMNS company_id varchar2(6) PATH '/cbc:CompanyID'
) x;