आपके पास प्रति माल कई कंटेनर हैं, और आप कच्चे एक्सएमएल से निकालने के बाद एलआरएन के आधार पर फ़िल्टर कर रहे हैं; इसलिए आपको नेस्टेड XMLTable ऑब्जेक्ट्स का उपयोग करने की आवश्यकता है। पहला व्यक्ति घोषणा से डेटा प्राप्त करता है और माल को उप-एक्सएमएल टाइप के रूप में निकालता है। इसके बाद इसे दूसरे 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';
आपके (अपडेटेड) नमूना एक्सएमएल के साथ, जो उत्पादन करता है:
LRN USERNAME CONTAINERNUMBER
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950 testSC testSC abcd
NLDMS111111150010950 testSC testSC bcde
NLDMS111111150010950 testSC testSC cdef
NLDMS111111150010950 testSC testSC defg
NLDMS111111150010950 testSC testSC efgh
उम्मीद है कि आप यही देखना चाहते हैं।
आप इसे एक एकल XMLTable में रखने के लिए अधिक जटिल XPath का भी उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यह अधिक स्पष्ट है।