Данные Postgre SQL в формате XML

#xml #postgresql

#xml #postgresql

Вопрос:

Привет, я пытаюсь преобразовать данные Postgre SQL в формат XML, используя следующее:

 copy(
select xmlroot
(
    xmlelement
    (
        name "warehouses",
        xmlagg
        (
            xmlelement
            (
                name "warehouse",
                xmlelement(name "id",warehouse.w_id),
                xmlelement(name "name",warehouse.w_name),
                xmlelement
                (
                    name "address",
                    xmlelement(name "street",warehouse.w_street),
                    xmlelement(name "city",warehouse.w_city),
                    xmlelement(name "country",warehouse.w_country)
                ),
                xmlelement
                (
                    name "items",
                    xmlagg(
                    xmlelement
                    (   
                        name "item",
                        xmlelement(name "id",item.i_id),
                        xmlelement(name "im_id",item.i_im_id),
                        xmlelement(name "name",item.i_name),
                        xmlelement(name "price",item.i_price),
                        xmlelement(name "qty",stock.s_qty)
                    ))
                )
            )
        ) 
    ), version '1.0" encoding = "utf-8'
) from warehouse inner join stock on warehouse.w_id = stock.w_id
                  inner join item on stock.i_id = item.i_id
) to '/home/cs4221/Desktop/test.xml'
  

Но показывает сообщение об ошибке:

«вызов агрегатных функций не может быть вложенным»

И указать на мою вторую функцию xmlagg.

Почему xmlagg не может быть вызван вложенным?

Без второго xmlagg вывод выглядит следующим образом:

 <warehouses>
<warehouse>
    <id>22</id>
    <name>Namekagon</name>
    <address>
        <street>Anniversary</street>
        <city>Singapore</city>
        <country>Singapore</country>
    </address>
    <items>
        <item>
            <id>4</id>
            <im_id>54868007</im_id>
            <name>MECLIZINE HYDROCHLORIDE</name>
            <price>54.49</price>
            <qty>597</qty>
        </item>
    </items>
</warehouse>
<warehouse>
    <id>22</id>
    <name>Namekagon</name>
    <address>
        <street>Anniversary</street>
        <city>Singapore</city>
        <country>Singapore</country>
    </address>
    <items>
        <item>
            <id>5</id>
            <im_id>24658312</im_id>
            <name>Doxycycline Hyclate</name>
            <price>28.99</price>
            <qty>477</qty>
        </item>
    </items>
</warehouse>
  

Идентификатор хранилища 22 содержит два элемента 4 и 5. Я хочу объединить их в один раздел.

Комментарии:

1. Можете ли вы привести нам пример, как должен выглядеть результат?

Ответ №1:

Для каждого выбранного параметра может быть только один xmlagg. Чтобы обойти это, вы можете использовать подвыборку в xmlelement и использовать там xmlagg следующего уровня.

Просто удалите соединение в и запроса и используйте что-то вроде:

   xmlelement
  (
    name "items", 
    (  
      select xmlagg
      (
        xmlelement
        (   
          name "item",
          xmlelement(name "id",item.i_id),
          xmlelement(name "im_id",item.i_im_id),
          xmlelement(name "name",item.i_name),
          xmlelement(name "price",item.i_price),
          xmlelement(name "qty",stock.s_qty)
        )
      )
    )
  )
  from stock where warehouse.w_id = stock.w_id 
    join item on stock.i_id = item.i_id)
  

Ответ №2:

 <warehouses>
<warehouse>
    <id>22</id>
    <name>Namekagon</name>
    <address>
        <street>Anniversary</street>
        <city>Singapore</city>
        <country>Singapore</country>
    </address>
    <items>
        <item>
            <id>4</id>
            <im_id>54868007</im_id>
            <name>MECLIZINE HYDROCHLORIDE</name>
            <price>54.49</price>
            <qty>597</qty>
        </item>
    </items>
</warehouse>
<warehouse>
    <id>22</id>
    <name>Namekagon</name>
    <address>
        <street>Anniversary</street>
        <city>Singapore</city>
        <country>Singapore</country>
    </address>
    <items>
        <item>
            <id>5</id>
            <im_id>24658312</im_id>
            <name>Doxycycline Hyclate</name>
            <price>28.99</price>
            <qty>477</qty>
        </item>
    </items>
</warehouse>
  

Комментарии:

1. идентификатор хранилища 22 содержит два элемента 4 и 5. я хочу объединить их в один раздел. я использовал xmlagg, но получил сообщение об ошибке: «вызов агрегатных функций не может быть вложенным» (приведенный выше вывод получен путем удаления второй функции xmlagg)