我正在为我们的 Oracle 系统使用基于 XML 的审计。每个表上都有触发器来创建记录的 XML 表示,该记录被插入或更新到我们数据库中的单个审计表中。审计数据的捕获工作正常,但是我在使用 Oracle 的 XML 解析实用程序提取信息时遇到问题。
以我们的 Gender 表为例,审计表有一个 XML 列,如下所示:
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<GENDER_ID>2</GENDER_ID>
<GENDER>Male</GENDER>
<GENDER_CODE>M</GENDER_CODE>
<LAST_MODIFIED_BY_USER>bob.smith</LAST_MODIFIED_BY_USER>
<LAST_MODIFIED_BY_DATE>08-JUN-13</LAST_MODIFIED_BY_DATE>
</ROW>
</ROWSET>
我希望能够将 XML 解析为两种格式之一。
- ROW 元素中的每个属性名称都是一列,每个属性值都是该列下方的值,或者
- 每个属性名称和值组合将在它自己的行上
使用以下脚本,我可以提取每个属性的值:
select extractValue(n.column_value, '/*') as Value
from (
select extract(XMLType(at.xml), '//ROWSET/ROW') as data from audit_table at
where at.audit_id = 1
) x,
TABLE (xmlSequence(extract(x.data,'/ROW/*'))) n
这会产生 5 行,其中包含一个“值”列:
- 2
- 男性
- 米
- 鲍勃史密斯
- 2013 年 6 月 8 日
这些值本身几乎没有用,我不知道如何让属性名称与值相关联。有没有办法让属性名称(即 GENDER_ID 或 GENDER_CODE)出现在关联列中?
如果您知道 XML 的元素是什么,那么有大量解析 XML 的示例。在我们的例子中,审计表将保存 Gender 的 XML(有 5 列)和具有广泛列名称和编号的其他表的 XML。
我想,由于可以提取列值,因此属性名称肯定也可以,但我就是想不通。
在此先感谢,蒂姆