【问题标题】:Oracle XMLSequence attribute name and value conversionOracle XMLSequence 属性名称和值的转换
【发布时间】:2015-07-24 13:35:04
【问题描述】:

我正在为我们的 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 知识的运气,我最终无法得到结果。 谢谢...

【问题讨论】:

  • 这不是有效的 XML - 你真正的 CLOB 有根节点吗?

标签: sql xml oracle


【解决方案1】:

XMLSequence 从 11g 开始被弃用。这是一个 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 属性包含在另一列中。

【讨论】:

  • 非常感谢 Alex 并为迟到的回复感到抱歉,因为该任务几乎被取消了。我在网上寻找了很多解决方案,但我认为这是迄今为止最好的一个:)。我有个问题。我们可以根据假设 AUDIT_TABLE.E_ID 用普通关节替换交叉连接吗
  • @user1744446 - 由于passing 子句,这是一个交叉连接;这实际上是一个连接条件(一种)。您仍然可以过滤 a.e_id 的特定值,或者甚至过滤 a.e_id = x.un(如果这是一个 ID)来查看它是否匹配。不过不太清楚你在问什么。
  • 我的意思是交叉连接不会返回实际数量的记录。假设上面的 xml 记录属于审计表中的一条记录(e_id = 1)。该解决方案将仅返回该记录作为结果,还是将其与表中的其他记录交叉。
  • @user1744446 - 每个 XML 文档将被转换为关系数据,每行出现一次。如果您有 100 行,并且每个 XML 扩展为三个关系行,如本例所示,那么您的完整结果集将是 300 行。 passing XMLType(a.clob_col) 表示仅使用该行的 XML。 x 中的每一行都与a 中的原始行相关(如果您愿意,可以选择“加入”)。在这种情况下,您不会得到笛卡尔积。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2014-12-21
相关资源
最近更新 更多