サイトに複数の建物がある場合がある2 つのテーブルsites
&を想像してください。buildings
地理空間データ マッピング用の xml を生成するクエリがあり、関数を使用してサイトに属するすべての建物を追加しようとしていLISTAGG
ます。
建物を追加する前の作業クエリ
SELECT XMLELEMENT("rss",
XMLATTRIBUTES('http://www.georss.org/georss' AS "xmlns:georss"),
XMLELEMENT("channel",
XMLAGG(XMLELEMENT("item",
XMLFOREST(title AS "title",
description AS "description",
point AS "georss:point"))))).EXTRACT('/*')
FROM (SELECT trim(s.sitedesc) AS title,
'Employee Count: ' || s.sitefte || '. Bldg Gross SF: ' || s.bldgarea || '. ' || CASE WHEN s.leasestat = '0' THEN 'Owned' WHEN s.leasestat = '1' THEN 'Leased, end date: ' || trim(l.edate) END AS description,
trim(s.latitude) || ' ' || trim(s.longitude) AS point
FROM site s, leases l
WHERE s.sold <> 1
AND s.longitude != ' '
AND s.sitecode = l.sitecode
)
LISTAGG 関数を単独で動作させることができます。
SELECT LISTAGG(trim(b.bldgcode)||' '||trim(b.bldgdesc), ', ') WITHIN GROUP (ORDER BY b.bldgcode) AS Bldgs
FROM buildings b, sites s
WHERE b.sitecode = s.sitecode
GROUP BY s.sitedesc
ただし、GROUP BY
句はxmlで「式によるグループではありません」というエラーをスローします(これは予想していましたが、修正できないようです)。以下のサンプル、 XMLELEMENT 内で LISTAGG を使用することは可能ですか?
SELECT XMLELEMENT("rss",
XMLATTRIBUTES('http://www.georss.org/georss' AS "xmlns:georss"),
XMLELEMENT("channel",
XMLAGG(XMLELEMENT("item",
XMLFOREST(title AS "title",
description AS "description",
point AS "georss:point"))))).EXTRACT('/*')
FROM (SELECT trim(s.sitedesc) AS title,
'Employee Count: ' || s.sitefte || '. Bldg Gross SF: ' || s.bldgarea || '. ' || CASE WHEN s.leasestat = '0' THEN 'Owned' WHEN s.leasestat = '1' THEN 'Leased, end date: ' || trim(l.edate) END || LISTAGG(trim(b.bldgcode)||' '||trim(b.bldgdesc), ', ') WITHIN GROUP (ORDER BY b.bldgcode) AS description,
trim(s.latitude) || ' ' || trim(s.longitude) AS point
FROM site s, lease l, buildings b
WHERE s.sold <> 1
AND s.longitude != ' '
AND s.sitecode = l.sitecode
AND b.sitecode = s.sitecode
GROUP BY s.sitedesc
)
希望する XML サンプル
<rss xmlns:georss="http://www.georss.org/georss">
<channel>
<item>
<title>SITE DESCRIPTION</title>
<description>Employee Count: ###. Bldg Gross SF: ####. Owned/Leased Building1, building2, etc.</description>
<georss:point>LAT LON</georss:point>
</item>
....
</channel>
</rss>