从具有 Oracle db 中的属性的 XML 中提取 NCLOB 中的 XML 数据

Posted

技术标签:

【中文标题】从具有 Oracle db 中的属性的 XML 中提取 NCLOB 中的 XML 数据【英文标题】:Extracting XML data from NCLOB from XML with attributes in Oracle db 【发布时间】:2015-05-17 04:02:57 【问题描述】:

我正在尝试从存储为 Oracle db 表中 NCLOB 列的 XML 数据中提取值。

xml结构

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://example.com/FAS/DOC/2011/v3.0b" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <record xmlns="http://example.com/FAS/DOC/2011/v3.0b">
    <pdate xmlns="http://example.com/FAS/DOC/2011/v3.0b">2014-05-15</pdate>
  </record>
</root>

查询

select EXTRACTVALUE(XMLTYPE(nclob_column),'/root/record/pdate','xmlns="http://example.com/FAS/DOC/2011/v3.0b"') pdate1,
       EXTRACTVALUE(XMLTYPE(nclob_column),'/root/record/pdate') pdate2
from   nclob_table

问题

pdate1 确实返回值,但 pdate2 返回 null。一世 不能使用 EXTRACTVALUE() 的第三个参数来指定 xmlns 属性值,因为它在每一行/记录上都会发生变化。所以我得到 一行的值,但所有其他行的值为 null。

如何在不指定属性的情况下提取值?

谢谢。

【问题讨论】:

【参考方案1】:

如果您可以保证命名空间在这种情况下对选择元素无关紧要,则可以使用local-name() 仅通过元素的本地名称匹配元素,忽略命名空间:

select EXTRACTVALUE(
            XMLTYPE(nclob_column),
            '/*[local-name()="root"]/*[local-name()="record"]/*[local-name()="pdate"]'
        ) pdate
from   nclob_table

SQL Fiddle

【讨论】:

以上是关于从具有 Oracle db 中的属性的 XML 中提取 NCLOB 中的 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 DB2 将所有列值作为 xml 属性返回?

如何跟踪存储在 Oracle Berkeley DB XML 中的文件的更改

使用 Oracle 数据库中的 SQL 从 XML Clob 中提取数据

从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记

使用Hibernate HQL从Oracle DB检索记录时的性能问题

如何显示表中的替代值,列具有值“M”和“F”(Oracle DB)