Существует несколько способов создания такого XML.
. Один из подходов заключается в работе с типами объектов:
CREATE OR REPLACE TYPE "City" AS OBJECT (
"CityId" NUMBER,
"CityName" VARCHAR2(100));
CREATE OR REPLACE TYPE "Cities_T" IS TABLE OF "City";
CREATE OR REPLACE TYPE "Province" AS OBJECT (
"ProvinceId" NUMBER,
"ProvinceName" VARCHAR2(100),
"Cities" "Cities_T"
);
CREATE OR REPLACE TYPE "Provinces_T" IS TABLE OF "Province";
CREATE OR REPLACE TYPE "Provinces" AS OBJECT (
"Provinces" "Provinces_T"
);
SELECT
XMLTYPE(
"Province"(
Prov_Code,
Prov_Name,
CAST(MULTISET(SELECT city_id, city_name FROM CITY c WHERE c.Prov_Code = p.Prov_Code ORDER BY city_id) AS "Cities_T")
)
)
FROM PROVINCE p
Или вы создаете элементы XML более вручную, например это:
SELECT
XMLELEMENT("Province",
XMLELEMENT("ProvinceId", Prov_Code),
XMLELEMENT("ProvinceName", Prov_Name),
XMLELEMENT("Cities", (
SELECT XMLAGG(
XMLELEMENT("City",
XMLELEMENT("CityId", city_id),
XMLELEMENT("CityName", city_name)
) ORDER BY city_id)
FROM CITY c
WHERE c.Prov_Code = p.Prov_Code)
)
)
FROM PROVINCE p
Я бы порекомендовал создать несколько представлений или таблиц CTE (используя WITH city AS (SELECT ...)
, тогда окончательное утверждение будет менее сложным, например,
CREATE OR REPLACE VIEW XV_CITY AS
SELECT Prov_Code,
XMLELEMENT("Cities",
XMLAGG(
XMLELEMENT("City",
XMLELEMENT("CityId", city_id),
XMLELEMENT("CityName", city_name)
) ORDER BY city_id)
) AS CITIES_XML
FROM CITY
GROUP BY Prov_Code;
SELECT
XMLELEMENT("Province",
XMLELEMENT("ProvinceId", Prov_Code),
XMLELEMENT("ProvinceName", Prov_Name),
(SELECT CITIES_XML FROM XV_CITY c WHERE c.Prov_Code = p.Prov_Code)
)
FROM PROVINCE p
. Другой подход заключается в использовании DBMS_XMLGEN , см. Также Создание XML Использование DBMS_XMLGEN