我的意图是“选择容器编号等于输入数据的数据”(搜索功能的种类)。当我尝试检索数据时遇到问题,在 where 条件下出现问题:
d:goodsShipments/d:consignment/d:transportEquipment/d:id/text()
在这里,我得到了多个数据。我不知道如何在 where 条件下迭代它。
我的查询是:
我的源 XML 是:
我如何选择所有 sealId 为 5678 的声明?在这种情况下如何处理 where 条件?
我的意图是“选择容器编号等于输入数据的数据”(搜索功能的种类)。当我尝试检索数据时遇到问题,在 where 条件下出现问题:
d:goodsShipments/d:consignment/d:transportEquipment/d:id/text()
在这里,我得到了多个数据。我不知道如何在 where 条件下迭代它。
我的查询是:
我的源 XML 是:
我如何选择所有 sealId 为 5678 的声明?在这种情况下如何处理 where 条件?
每个货物有多个容器,并且在从原始 XML 中提取 LRN 后基于 LRN 进行过滤;所以你需要使用嵌套的 XMLTable 对象。第一个从声明中获取数据并将货物提取为子 XMLType。然后将其传递给提取容器信息的第二个 XMLTable。
SELECT x1.lrn, x1.username, x2.containerNumber
FROM dmsimport_decl d
CROSS JOIN XMLTable(
XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
'http://www.xxxx.invalid/xxx/schema/common' AS "c",
'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"),
'/d:declaration'
PASSING d.object_value
COLUMNS
lrn VARCHAR2(35 CHAR)
PATH 'c:declarationHeader/c:localReferenceNumber/text()',
username CHAR(25)
PATH 'c:declarationHeader/c:username/text()',
consignment XMLType
PATH 'd:goodsShipments/d:consignment'
) x1
CROSS JOIN XMLTable(
XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
'http://www.xxxx.invalid/xxx/schema/common' AS "c",
'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"),
'//d:transportEquipment'
PASSING x1.consignment
COLUMNS
containerNumber VARCHAR2(35 CHAR)
PATH 'd:id/text()'
) x2
WHERE x1.lrn = 'NLDMS111111150010950';
使用您的(更新的)示例 XML,将产生:
LRN USERNAME CONTAINERNUMBER
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950 testSC testSC abcd
NLDMS111111150010950 testSC testSC bcde
NLDMS111111150010950 testSC testSC cdef
NLDMS111111150010950 testSC testSC defg
NLDMS111111150010950 testSC testSC efgh
希望这是你想看到的。
您还可以使用更复杂的 XPath 将其保存在单个 XMLTable 中,但我认为这更清楚。
您可以使用以下查询来迭代并从容器组件中获取 id。
SELECT x1.lrn, x1.username, x2.containerNumber
FROM dmsimport_decl d
CROSS JOIN XMLTable(
XMLNAMESPACES(DEFAULT 'http://www.SSSSSSS/dmsimport',
'http://www.SSSSSSScommon' AS "c",
'http://www.SSSSSSSS/dmsimport' AS "d"),
'/d:declaration'
PASSING d.object_value
COLUMNS
lrn VARCHAR2(35 CHAR)
PATH 'c:declarationHeader/c:localReferenceNumber/text()',
username CHAR(25)
PATH 'c:declarationHeader/c:username/text()',
containerComponent XMLType
PATH 'd:goodsShipments/d:goodsItems'
) x1.
CROSS JOIN XMLTable(
XMLNAMESPACES(DEFAULT 'http://www.SSSSSSSSS/dmsimport',
'http://www.SSSSSS/common' AS "c",
'http://www.SSSSSSSS/dmsimport' AS "d"),
'//d:containerComponent'
PASSING x1.containerComponent
COLUMNS
containerNumber VARCHAR2(35 CHAR)
PATH 'd:id/text()'
) x2
WHERE x1.lrn = 'NL123456789160000464';