Oracle Database 11g 企业版 11.2.0.4.0 - 64 位生产
有一个巨大的 XML,您需要在服务器端从中取出一些数据。我将 XML 加载到 XmlType 并使用 XPath 获取必要的数据。例如:
declare
xml XmlType;
begin
xml := XmlType('
<xml>
<a>
<b>0</b>
<c>1</c>
<d>
<e>2</e>
<e>3</e>
<e>4</e>
</d>
<d>
<e>5</e>
<e>6</e>
<e>7</e>
</d>
<d>
<e>8</e>
<e>9</e>
</d>
</a>
</xml>');
:r0 := xml.extract('//xml/a/b/text()').getStringVal();
:r1 := xml.extract('//xml/a/c/text()').getStringVal();
:r2 := xml.extract('//xml/a/d[1]/e[1]/text()').getStringVal();
end;
单个元素没有问题,它们通常被提取,但是重复的呢?如上面的示例,我有一个未知数量的元素d
,每个元素都包含未知数量的元素e
,我需要依次提取每个元素并在其上执行一些服务器方法。
我可以通过索引访问,但我不知道如何获取这些元素的数量,我知道 XPath 有一个内置函数count
,但我不明白如何使用它以及我的数据库是否支持它。
尝试调用类似这样xml.extract('count(//xml/a/d)')
的内容会导致消息“不支持指定的 XPATH 表达式”。
访问不存在的索引时,发生异常SELF_IS_NULL
,您可以以某种方式使用它吗?虽然,当然,我不想在异常上建立逻辑......
您可以使用XMLSequence或XMLTable 函数。例如,您可以
e
使用以下查询从文档中获取单独行中的所有值:此外,您可以通过选择单个 d 元素,然后从中获取一些值,将 xml 扩展为关系表来进行多个级别。相同的一组值是这样获得的:
在这种情况下,我们得到了元素
d
,我们可以将元素作为一个整体来看待,或者选择这个特定节点的一些其他特定值。此外,通过向 from 添加一个 xmlsequence 来扩展所选节点的元素。如果您想在过程中使用它,那么您可以编写例如:
我还在互联网上找到了以下程序样式的构造:
他们写道,它比解析请求更快。取自 sql.ru 的示例