如何使用Oracle-Xquery从存储在多行中的XML中检索属性的值?

时间:2012-09-12 14:17:55

标签: oracle11g xquery

我们正在使用Oracle 11g数据库和XMLDB安装。我们正在使用XMLType列表。对于表中的所有行,XML的结构都是相同的。该表还将有其他的fiedls。

现在我想从所有行中仅检索特定节点的属性值的值作为带有一些其他关系字段的字符串。检索到的表列可以是TemplateId,TemplateVid,TemplatepartId。

XML的结构如下:

<Template ID=1000 VID=1>
  <TemplateParts>
    <Template ID="4000" VID="1"/>
    <Template ID="4001" VID="1"/>
  </TemplateParts>
</Template>

因此,该表将包含Template with TemplateId,Vid和TemplateXML的模板数据。 TemplateXML字段是XMLType字段。现在我想要将所有TemplateId,Vid及其引用的模板partIds检索为XML表。输出应如下:

TemplateId - TemplateVid - TemplatePartId - TemplatepartVid
1000           1             4000             1
1000           1             4001             1

所以任何人都会针对上述要求提出正确的Xquery。

2 个答案:

答案 0 :(得分:0)

你的要求不明确,但是要开始你,希望能从StackOverflow上更广泛的XQuery社区获得一些额外的评论,这是一个简单的例子。希望这会有所帮助:)

xquery version "1.0";

<html>
<head>
<title>Sample</title>
</head>
<body>
<div align="center">
<table>
<tr><th>TemplateId</th><th>TemplateVid</th><th>TemplatePartId</th><th>TemplatepartVid</th></tr>
{
    let $sample as element()* := (<root><Template ID="1000" VID="1"><TemplateParts><Template ID="4000" VID="1" /><Template ID="4001" VID="1" /></TemplateParts></Template></root>)
    for $e in $sample/Template
    return
        for $tp in $e/TemplateParts/Template
        return 
            (<tr><td>{data($e/@ID)}</td><td>{data($e/@VID)}</td><td>{data($tp/@ID)}</td><td>{data($tp/@VID)}</td></tr>)
}
</table>
</div>
</body>
</html>

答案 1 :(得分:0)

正如我在之前的评论中所提到的,我已经设法从所有行的xmltype列中获取存储在Node / Template / TemplateParts / Template下的ID和VID。查询如下:

select distinct  x.value as TemplatePartId,Y.Value as Vid from 
TempVersion t ,
xmltable('/Template/TemplateParts/Template' passing t.CONTENT columns  value    varchar2(10) path '@ID' ) x,
  xmltable('/Template/TemplateParts/Template' passing t.CONTENT columns  value varchar2(10) path '@VID' ) y
    order by TemplatePartId;

如果sombody知道更好的格式,请发布您的示例查询。我需要作为普通查询,因为我的ORM工具不支持上述格式。如果查看上面的查询,您会注意到XMLTable表达式将放在From子句之后。当我尝试通过LLBLGen ORM工具形成此查询时,这会给您带来麻烦。