Bạn có nhiều thùng chứa cho mỗi lô hàng và bạn đang lọc dựa trên LRN sau khi trích xuất dữ liệu đó từ XML thô; vì vậy bạn cần sử dụng các đối tượng XMLTable lồng nhau. Cái đầu tiên lấy dữ liệu từ tờ khai và trích xuất các lô hàng dưới dạng một XMLType con. Sau đó, nó được chuyển đến XMLTable thứ hai để trích xuất thông tin vùng chứa.
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';
Với XML mẫu (đã cập nhật) của bạn, nó tạo ra:
LRN USERNAME CONTAINERNUMBER
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950 testSC testSC abcd
NLDMS111111150010950 testSC testSC bcde
NLDMS111111150010950 testSC testSC cdef
NLDMS111111150010950 testSC testSC defg
NLDMS111111150010950 testSC testSC efgh
Hy vọng rằng đó là những gì bạn muốn xem.
Bản trình diễn SQL Fiddle nhanh .
Bạn cũng có thể sử dụng XPath phức tạp hơn để giữ nó trong một XMLTable duy nhất, nhưng tôi nghĩ điều này rõ ràng hơn.