2015-04-29 62 views
1

我的意圖是「選擇容器號碼等於輸入數據的數據」(搜索功能類型)。我現在面臨一個問題,當我試圖檢索數據,有一個問題在這裏的條件:獲得多項目序列

d:goodsShipments/d:consignment/d:transportEquipment/d:id/text() 

在這裏,我越來越多的數據。我不知道如何在where條件下迭代它。

我的查詢是:

我的源XML是:

如何我可以選擇所有的聲明,其中sealId是5678? 如何處理這種情況下的情況?

+0

示例XML是不完整的或有效的。你有'​​323'帶有不匹配的命名空間; ''沒有結束標籤;它沒有'declaration','localReferenceNumber'等;你的查詢的其他部分似乎不符合那裏的結構。很難用錯誤的信息來解釋你在做什麼。 –

+0

嗨亞歷克斯, 增加了新的XML是從數據庫中取得 – Ramesh

+0

好吧,我已經更新了我的答案,以使用您的示例;只有真正的變化是'/ c:declaration'變成'/ d:declaration'。 –

回答

3

您的每批貨物都有多個容器,並且您從原始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        

希望這是你想看到的東西。

Quick SQL Fiddle demo

您也可以使用更復雜的XPath將其保存在單個XMLTable中,但我認爲這更清晰。

0

您可以使用下面的查詢迭代和容器組件獲得的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';