2016-02-04 24 views
1

我在Oracle中有一列存在XML,存儲爲CLOB類型。我的意圖是解析這個XML並檢索對應於感興趣列的數據。這是XML結構:如何在Oracle中使用以下XML中的XML表格

<ns:ABCDE xmlns:ns="http://www.something.com/something" xmlns:mno="http://www.somethingelse.com/05" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:type="ns:ABCDE"> 

<GGGGG> 
    <G1>G1_val</G1> 
    <G2>G2_val</G2> 
    <G3>G3_val</G3> 
</GGGGG> 
<PPPPP> 
... 
</PPPP> 

</ns:ABCDE> 

這是SQL代碼,我有:

select x.*,p.* 
    from ppp p ,xmltable(

    xmlnamespaces(default 'ABCDE', 
    'http://www.something.com/something' as "ns", 
    'http://www.somethingelse.com/05' as "mno", 
'http://www.w3.org/2001/XMLSchema-instance' as "xsi", 
    'ns:ABCDE' as "type" 
      ),  

    '/ns:ABCDE' 
    PASSING xmltype(p.someCLOB_column) 
    COLUMNS G1 varchar(32) PATH '/GGGGG' 

    ) x 

然而,在運行SQL後,不顯示任何錯誤,但沒有記錄被取出要麼。作爲此查詢的結果,我期待得到「G1_val」。

代碼出錯了?我對xml/namespaces不太熟悉。

謝謝。

+0

你的XPath有'NS:ABCCDE',而不是'NS:ABCDE'但這可能是造成問題的錯字。它在xmlnamespaces子句中也有一個尾隨逗號。爲什麼你期待'G1_val'而不是'GGGGG'下的所有三個節點?如果我用你的示例運行該查詢,我會得到'G1_valG2_valG3_val'和'...'。 –

+0

@AlexPoole - 謝謝。那些是錯別字。我糾正了他們。正如你所說,是的,我應該得到G1_valG2_valG3_val,我錯了。但在我的情況下,我在運行查詢時沒有收到任何記錄 - 即使數據不正確。 – maverick

回答

1

我不知道爲什麼你沒有看到任何東西;我看到了錯誤的東西,但這可能歸結於我認爲的Oracle版本,或者與真實的XML和代碼不同。默認的命名空間是令人困惑的問題,不應該在那裏;和GGGGG路徑不需要領先斜線:

with ppp (someCLOB_column) as (
    select '<ns:ABCDE xmlns:ns="http://www.something.com/something" xmlns:mno="http://www.somethingelse.com/05" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns:ABCDE"> 
<GGGGG> 
    <G1>G1_val</G1> 
    <G2>G2_val</G2> 
    <G3>G3_val</G3> 
</GGGGG> 
<PPPPP>...</PPPPP> 
</ns:ABCDE>' from dual 
) 
select x.g1 
from ppp p 
cross join xmltable(
    xmlnamespaces(--default 'ABCDE', 
    'http://www.something.com/something' as "ns", 
    'http://www.somethingelse.com/05' as "mno", 
    'http://www.w3.org/2001/XMLSchema-instance' as "xsi", 
    'ns:ABCDE' as "type" 
),  
    '/ns:ABCDE' 
    PASSING xmltype(p.someCLOB_column) 
    COLUMNS G1 varchar(32) PATH 'GGGGG' 
) x 
/

G1        
-------------------------------- 
G1_valG2_valG3_val    

你可能想盡管個別數值:

select x.g1, x.g2, x.g3, x.ppppp 
from ppp p 
cross join xmltable(
    xmlnamespaces(--default 'ABCDE', 
    'http://www.something.com/something' as "ns", 
    'http://www.somethingelse.com/05' as "mno", 
    'http://www.w3.org/2001/XMLSchema-instance' as "xsi", 
    'ns:ABCDE' as "type" 
),  
    '/ns:ABCDE' 
    PASSING xmltype(p.someCLOB_column) 
    COLUMNS G1 varchar(8) PATH 'GGGGG/G1', 
    G2 varchar(8) PATH 'GGGGG/G2', 
    G3 varchar(8) PATH 'GGGGG/G3', 
    PPPPP varchar2(8) PATH 'PPPPP' 
) x 
/

G1  G2  G3  PPPPP 
-------- -------- -------- -------- 
G1_val G2_val G3_val ...