1

我正在为我们的 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。

我想,由于可以提取列值,因此属性名称肯定也可以,但我就是想不通。

在此先感谢,蒂姆

4

1 回答 1

2

您可以使用getrootelement()函数来获取属性名称。一个例子,

SELECT EXTRACTVALUE (n.COLUMN_VALUE, '/*') AS NODE_VALUE,
       n.COLUMN_VALUE.getrootelement () AS NODE_NAME
  FROM (SELECT EXTRACT (
                  XMLType (
                     '<?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>'),
                  '//ROWSET/ROW')
                  AS data
          FROM DUAL) x,
       TABLE (XMLSEQUENCE (EXTRACT (x.data, '/ROW/*'))) n

输出:

NODE_VALUE    NODE_NAME
-----------------------------------
2             GENDER_ID
Male          GENDER
M             GENDER_CODE
bob.smith     LAST_MODIFIED_BY_USER
08-JUN-13     LAST_MODIFIED_BY_DATE
于 2013-06-08T01:20:32.830 回答