Je hebt meerdere containers per zending en je filtert op basis van LRN nadat je dat uit de onbewerkte XML hebt geëxtraheerd; dus u moet geneste XMLTable-objecten gebruiken. De eerste haalt de gegevens uit de aangifte en extraheert de zendingen als sub-XMLType. Dat wordt dan doorgegeven aan de tweede XMLTable die de containerinformatie extraheert.
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';
Met uw (bijgewerkte) voorbeeld-XML levert dat:
LRN USERNAME CONTAINERNUMBER
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950 testSC testSC abcd
NLDMS111111150010950 testSC testSC bcde
NLDMS111111150010950 testSC testSC cdef
NLDMS111111150010950 testSC testSC defg
NLDMS111111150010950 testSC testSC efgh
Hopelijk is dat wat je wilt zien.
Je zou ook een ingewikkelder XPath kunnen gebruiken om het binnen een enkele XMLTable te houden, maar ik denk dat dit duidelijker is.