我的意圖是「選擇容器號碼等於輸入數據的數據」(搜索功能類型)。我現在面臨一個問題,當我試圖檢索數據,有一個問題在這裏的條件:獲得多項目序列
d:goodsShipments/d:consignment/d:transportEquipment/d:id/text()
在這裏,我越來越多的數據。我不知道如何在where條件下迭代它。
我的查詢是:
我的源XML是:
如何我可以選擇所有的聲明,其中sealId是5678? 如何處理這種情況下的情況?
我的意圖是「選擇容器號碼等於輸入數據的數據」(搜索功能類型)。我現在面臨一個問題,當我試圖檢索數據,有一個問題在這裏的條件:獲得多項目序列
d:goodsShipments/d:consignment/d:transportEquipment/d:id/text()
在這裏,我越來越多的數據。我不知道如何在where條件下迭代它。
我的查詢是:
我的源XML是:
如何我可以選擇所有的聲明,其中sealId是5678? 如何處理這種情況下的情況?
您的每批貨物都有多個容器,並且您從原始XML中提取基於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';
示例XML是不完整的或有效的。你有'323'帶有不匹配的命名空間; ''沒有結束標籤;它沒有'declaration','localReferenceNumber'等;你的查詢的其他部分似乎不符合那裏的結構。很難用錯誤的信息來解釋你在做什麼。 –
嗨亞歷克斯, 增加了新的XML是從數據庫中取得 – Ramesh
好吧,我已經更新了我的答案,以使用您的示例;只有真正的變化是'/ c:declaration'變成'/ d:declaration'。 –