2015-05-13 78 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