У вас есть несколько контейнеров на консигнацию, и вы фильтруете на основе LRN после извлечения из исходного XML; поэтому вам нужно использовать вложенные объекты 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
Надеется, что это то, что вы хотите увидеть.
Quick SQL Fiddle demo.
Вы также можете использовать более сложный XPath, чтобы держать его в пределах одного XMLTable, но я думаю, что это яснее.
Ваш образец XML не является полным или действительным. У вас есть '' с несогласованными пространствами имен; '' без закрывающего тега; он не имеет «декларации», «localReferenceNumber» и т. д .; другие части вашего запроса, похоже, не соответствуют структуре, которая есть. Трудно интерпретировать то, что вы делаете, с неправильной информацией. –
Привет Алекс, добавил новый xml, который взят из базы данных – Ramesh
ОК, я обновил свой ответ, чтобы использовать ваш образец; только реальное изменение: '/ c: declaration' становится'/d: declaration'. –