1

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

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

XML的结构可以如下:

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

因此,该表将包含具有 TemplateId、Vid 和 TemplateXML 的模板数据。TemplateXML 字段是一个 XMLType 字段。现在我想以 XML 表的形式检索所有 TemplateId、Vid 及其引用的模板 partId。输出应如下所示:

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

所以任何人都想出一个正确的 Xquery 来满足上述要求。

4

2 回答 2

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>
于 2012-09-13T15:23:02.813 回答
0

正如我在之前的评论中提到的,我已经设法从所有行的 xmltype 列中获取存储在节点 /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;

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

于 2012-09-14T13:13:54.280 回答