Oracle XMLSequence属性名称和值转换

时间:2015-05-13 10:15:47

标签: sql xml oracle

我正在为我们的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解析为两种格式之一。

  • ROW元素中的每个属性名称都是一列,每个属性值都是列下面的值,或者
  • 每个属性名称和值组合都在其自己的行

任何人都可以帮我一个代码,以达到我的搜索目的并尝试其他旧线程,但由于XML的知识运气,我最终无法得到结果。 谢谢......

1 个答案:

答案 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属性作为另一列添加。