Oracle XML ORA-00978: функция вложенной группы без GROUP BY - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь сгенерировать XML с использованием Oracle функций XML, но продолжаю получать функцию вложенной группы ORA-00978: без сообщения об ошибке GROUP BY.

Я новичок в XML, а также Oracle XML, поэтому мне кажется, что я упускаю что-то важное, однако, просматривая примеры в Интернете, я не могу понять, что я делаю неправильно.

SQL:

select
  xmlelement("apiRequest",
    xmlelement("orders",
      xmlagg(
        xmlelement("order",
          xmlelement("no", orders.order_no),
          xmlelement("date", orders.date),
          xmlelement("orderItems",
            xmlagg(
              xmlelement("orderItem",
                xmlelement("position", order_items.item_position)
              )
            )
          )
        )
      )
    )
  )
  as xml
from
  ...

Желаемый вывод:

<apiRequest>
  <orders>
    <order>
      <no>1</no>
      <date>04/03/2010</date>
      <orderItems>
        <orderItem>
          <position>1</position>
        </orderItem>
        <orderItem>
          <position>2</position>
        </orderItem>
        <orderItem>
          <position>3</position>
        </orderItem>
        <orderItem>
          <position>4</position>
        </orderItem>
      </orderItems>
    </order>
    <order>
      <no>2</no>
      <date>04/03/2010</date>
      <orderItems>
        <orderItem>
          <position>1</position>
        </orderItem>
        <orderItem>
          <position>2</position>
        </orderItem>
        <orderItem>
          <position>3</position>
        </orderItem>
        <orderItem>
          <position>4</position>
        </orderItem>
      </orderItems>
    </order>
  </orders>
</apiRequest>

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Когда вы делаете вложенное агрегирование, вам нужно предложение GROUP BY. Первый уровень агрегации находится на уровне GROUP BY, затем результат снова агрегируется.

Для иллюстрации я использовал таблицы ORDERS и ORDER_ITEMS из схемы OE, которые Oracle обеспечивает.

select
  xmlelement("apiRequest",
    xmlelement("orders",
      xmlagg(
        xmlelement("order",
          xmlelement("no", order_id),
          xmlelement("date", oe.orders.order_date),
          xmlelement("orderItems",
            xmlagg(
              xmlelement("orderItem",
                xmlelement("position", oe.order_items.line_item_id)
              )
            )
          )
        )
      )
    )
  )
  as xml
from oe.orders join oe.order_items using(order_id)
group by order_id, order_date;

В другом ответе используется скалярный подзапрос, которого я бы избегал в этом случае, поскольку он выполняет по одной рекурсивной операции SQL для каждого заказа вместо простого объединения.

0 голосов
/ 04 марта 2020

Вы можете поместить второй xmlagg в подзапрос, он дает желаемый результат:

select 
  xmlelement("apiRequest",
    xmlelement("orders",
      xmlagg(
        xmlelement("order",
          xmlelement("no", orders.order_no),
          xmlelement("date", orders.order_date),
          xmlelement("orderItems",
            (select xmlagg(
              xmlelement("orderItem",
                xmlelement("position", order_items.item_position)
              )
            )
            from order_items where order_no = orders.order_no)
          ))))) as xml
  from orders 

dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...