2015-05-13 76 views
0

我正在爲我們的Oracle系統使用基於XML的審計。每個表上都有觸發器,用於創建要插入或更新到我們數據庫中的單個審計表中的記錄的XML表示。審計數據的捕獲工作正常,但是我遇到了使用Oracle的XML解析實用程序提取信息的問題。Oracle XMLSequence屬性名稱和值轉換

使用我們的審計表爲例,審計表有一個XML列(CLOB數據類型),像下面這樣:

<Audit ev='MSGADT0052$' un='ANSAR' dt='09/06/2013 16:39 '/> 
<bo n='EntityDocumentBO'/> 
<A n='DocExpiryDate' nv='24-07-2015' ov='05-10-2018'/> 
<A n='DocDescr' nv='National ID' ov='National ID'/> 
<A n='DocReceivedDate' nv='09/06/2013 16:39 ' ov='24-11-2009 '/> 

我希望能夠將XML解析爲以下兩種格式之一。

  • 每個屬性的ROW元素中的名稱將是一列,每個屬性值將列下的每個屬性名稱和值組合是在它自己的行的值,或

任何人都可以請幫我用一個代碼來服務我的目的作爲搜索和嘗試其他舊線程,但我不能以XML的知識運氣結果結果。 謝謝...

+1

這不是有效的XML - 你真正的CLOB是否有根節點? –

+0

回答

1

XMLSequence已從11g中棄用。下面是得到審計署屬性的XMLTable的方法和A屬性爲列:

select x.* 
from audit_table a 
cross join XMLTable('for $i in /auditrec 
    for $j in $i/A 
     return <row ev="{$i/Audit/@ev}" un="{$i/Audit/@un}" dt="{$i/Audit/@dt}" 
     n="{$j/@n}" ov="{$j/@ov}" nv="{$j/@nv}"/>' 
    passing XMLType(a.clob_col) 
    columns ev varchar2(11) path '@ev', 
    un varchar2(5) path '@un', 
    dt varchar2(10) path '@dt', 
    n varchar2(20) path '@n', 
    ov varchar2(16) path '@ov', 
    nv varchar2(16) path '@nv' 
) x; 
EV   UN DT   N     OV    NV    
----------- ----- ---------- -------------------- ---------------- ---------------- 
MSGADT0052$ ANSAR 09/06/2013 DocExpiryDate  05-10-2018  24-07-2015  
MSGADT0052$ ANSAR 09/06/2013 DocDescr    National ID  National ID  
MSGADT0052$ ANSAR 09/06/2013 DocReceivedDate  24-11-2009  09/06/2013 16:39 

我已經限制列的大小安靜一點,以減少滾動這裏,所以你需要設置那些適合您實際數據的長度。如果需要,可以將bo節點的n屬性作爲另一列加入。

+0

非常感謝Alex,對於遲到的回覆感到抱歉,因爲這個任務幾乎被取消了。我在網上尋找了很多解決方案,但我認爲這是迄今爲止最好的解決方案:)。我有個問題。我們可以用一個普通的關節替換交叉連接,可以說AUDIT_TABLE.E_ID – user1744446

+0

@ user1744446 - 由於'傳遞'子句,它是一個交叉連接;這實際上是一種連接條件(種類)。你仍然可以爲'a.e_id'過濾特定的值,或者甚至在'a.e_id = x.un'上過濾一個特定的值,以查看它是否匹配。不太清楚你在問什麼。 –

+0

我的意思是交叉連接劑量不會返回現實的記錄數。可以說上面的xml記錄屬於審計表(e_id = 1)中的一條記錄。此解決方案是否只會返回該記錄,否則將與表中的其他記錄交叉。 – user1744446