【问题标题】:How to retrieve a value of an attribute from the XML stored across multiple rows using Oracle-Xquery?如何使用 Oracle-Xquery 从存储在多行中的 XML 中检索属性值?
【发布时间】:2012-09-12 14:17:54
【问题描述】:

我们正在使用带有 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 来满足上述要求。

【问题讨论】:

    标签: oracle11g xquery


    【解决方案1】:

    您的要求尚不清楚,但希望您能从 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>
    

    【讨论】:

    • 我想你误会了我的要求。我需要获取存储在数据类型“XMLType”的关系表(Oracle11g)列中的数据。该表将具有 noraml 列(int、varchar2 等)和一个数据类型为“XMLType”的列,其中包含我邮件中提到的结构。我的要求是仅从所有行中检索 TemplatePartId 及其 Vid。无论如何,在我同事的帮助下,我设法做到了。请看我的回答。
    • 我认为您必须承认要求不明确.....正如我所说。无论如何,祝你好运。
    • 你好 Mactwixs,是的,我在最初的帖子中可能没有正确解释。一些术语,如 table、xml table、xquery 可能会让一些人想到纯 XML-Xquery 的用法。无论如何感谢您的建议,因为它可能对其他用户仍然有用。
    【解决方案2】:

    正如我在之前的评论中提到的,我已经设法从所有行的 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 工具构建此查询时,这会带来麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多