2013-12-13 2 views
0

У меня простая структура таблицы в базе данных Oracle (11gR2). Используя общие термины, у меня есть «группы», чем содержащие один или несколько «элементов»; то есть отношения «один ко многим». Таким образом, таблица «item» имеет поле «group_id», которое является внешним ключом в том же поле в таблице «group».Как извлечь реляционные данные из базы данных Oracle в структурированный XML-файл?

Есть ли запрос, который я могу использовать для извлечения этих данных из базы данных в формате XML? Я хотел бы результат быть что-то вроде этого:

<groups> 
    <group name="group1"> 
    <item name="item1"> 
    <item name="item2"> 
    </group> 
    <group name="group2"> 
    <item name="item3"> 
    <item name="item4"> 
    </group> 
</groups> 

Я начал писать это в/процедуры PL SQL как цикл в цикле, то есть цикл по группам, то через элементы внутри каждой группы, но что кажется длинным. Я надеялся, что будет запрос с использованием «XMLTable» или «XMLForest», который я мог бы использовать для такого рода структуры.

ответ

2

Использование XMLAgg (агрегировать, что вы GROUP BY):

SELECT  CAST(
       XmlElement("groups", 
        XmlAgg(
         XmlElement(
          "group" 
          ,XmlAttributes(g.name as "name") 
          ,XmlAgg(
           XmlElement(
            "item" 
            ,XmlAttributes(i.name as "name") 
          ) 
          ) 
         ) 
        ) 
       ) 
       AS VARCHAR2(4000) 
      ) MY_XML 
FROM  group g 
INNER JOIN item i ON i.groupid = g.id 
GROUP BY g.name 
; 

См XMLAgg документация: http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb13gen.htm#i1032865

+0

Спасибо, я попробую это! –

+0

Итак, я, наконец, обошел это с моими данными! Ваше решение работает, но как я могу включить группы, которые не содержат никаких элементов? Так что я бы хотел что-то вроде: '<название группы = "g1">' или: '<название группы = "g1"/>' –

+0

ОК, я думаю, я работал его используя комбинацию XMLForest и XMLAgg: D –