2017-09-15 118 views
0
<input xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" user="ABC" userid="xyz123" xmlns="urn:www.google.com/testsystem"> 
    <ProcessData>  
    <reviewYear>2014-2015</reviewYear> 
    </ProcessData> 
</input> 

我在xmltype列中有上面的示例數據,什麼是sql查詢來提取userid或用戶值的值。我嘗試了幾種使用/ input和名稱空間的方式,沒有返回值,謝謝。查詢xml類型的列以提取值Oracle數據庫

+1

歡迎使用Stack Overflow。你已經嘗試了什麼?請回顧[我如何問一個好問題](https://stackoverflow.com/help/how-to-ask)。你的問題應該包括你的*特定*編碼相關問題的清晰概述,你已經嘗試過的內容以及[最小,完整和可驗證示例]中相關代碼的摘要(https://stackoverflow.com/help/mcve),所以我們有足夠的信息能夠提供幫助。 – FluffyKitten

回答

0

您需要包含默認名稱空間。由於沒有名稱空間前綴,因此可以將其作爲默認值。

WITH test_data AS (
    SELECT 
     xmltype('<input xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" user="ABC" userid="xyz123" xmlns="urn:www.google.com/testsystem"> 
    <ProcessData>  
    <reviewYear>2014-2015</reviewYear> 
    </ProcessData> 
</input>' 
) xml_col 
    FROM 
     dual 
) SELECT 
    extractvalue(
     xml_col, 
     '/input/@user', 
     'xmlns="urn:www.google.com/testsystem"' 
    ) user_val, 
    extractvalue(
     xml_col, 
     '/input/@userid', 
     'xmlns="urn:www.google.com/testsystem"' 
    ) userid_val 
FROM 
    test_data 
+0

謝謝,這解決了我的問題,我錯過了@符號 – Srini

0

以下是如何使用XMLTABLE()函數提取屬性的方法。由於user是Oracle中的保留字,因此請謹慎使用USER作爲列名的候選項。你好得多使用,如下面所示的東西列名不同,也許USR

select x.usr, x.userid 
from test_data td, 
     xmltable('/' 
       passing td.xml_str 
       columns 
        usr varchar2(100) path '@user', 
        userid varchar2(80) path '@userid' 
       ) x 
; 

其中test_data與XML列xml_str表的名稱(用您的實際表和列名,或者任何機制將字符串傳遞給XMLTABLE()。)