我正在为我们的Oracle系统使用基于XML的审计。每个表上都有触发器来创建正在插入或更新到我们数据库中的单个审计表中的记录的XML表示。捕获审计数据工作正常,但是我在使用Oracle的XML解析实用程序提取信息时遇到了问题。
使用我们的审计表作为示例,审计表具有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解析为两种格式之一。
任何人都可以帮我一个代码,以达到我的搜索目的并尝试其他旧线程,但由于XML的知识运气,我最终无法得到结果。 谢谢......
答案 0 :(得分:1)
从11g弃用XMLSequence。这是一个XMLTable方法,它将Audit属性和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
属性作为另一列添加。