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 を含む Template のデータが含まれます。TemplateXML フィールドは XMLType フィールドです。ここで、すべての TemplateId、Vid およびその参照テンプレートの partId を XML テーブルとして取得したいと考えています。出力は次のようになります。

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

したがって、誰でも上記の要件を満たす正しい Xquery を考え出すことができます。

4

2 に答える 2

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;

誰かがより良い形式を知っている場合は、サンプル クエリを投稿してください。上記の形式は ORM ツールでサポートされていないため、通常のクエリとして必要です。上記のクエリを見ると、XMLTable 式が From 句の後に配置されていることがわかります。これにより、LLBLGen ORM ツールを使用してこのクエリを作成しようとすると問題が発生します。

于 2012-09-14T13:13:54.280 に答える
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 に答える