Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 XmlAgg into XmlForest  [new]
rnt777
Member

Откуда: Мгн
Сообщений: 12
Всем доброго дня!
Изучаю XML в Оракле (11.2.0.4.0). Возник вопрос, вроде простой, но что-то решение не найду.
Люди знающие, подскажите, пожалуйста, как в примере ниже, избавиться от тега "a", оставив его дочерние ветки?

+ запрос

with xR as (select 11 P_Id
            from dual),
    xPs as (select 11 P_Id,
                   444 Num,
                   333.22 SumTotal
            from dual),
     xP as (select 444 Num,
                   '123456789' Acc,
                   111.11 Sum
            from dual
            union all
            select 444 Num,
                   '987654321' Acc,
                   222.11 Sum
            from dual)

select xmlelement("Root",
         xmlforest(
           r.p_Id as "p_Id",
           xmlforest(
             ps.Num       as "Num",
             ps.SumTotal  as "SumTotal",
             xmlagg(
               xmlelement("Payment",
                 xmlforest(
                       p.Acc as "Acc",
                       p.Sum as "Sum"
                 )
               )
             ) "a"
           ) "Payments"
         )
       ) x
from xP p, xPs ps, xR r
where ps.P_Id = r.P_Id
and p.Num = ps.Num



+ результат

<?xml version="1.0"?>
<Root>
  <p_Id>11</p_Id>
  <Payments>
    <Num>444</Num>
    <SumTotal>333.22</SumTotal>
    <a>
      <Payment>
        <Acc>123456789</Acc>
        <Sum>111.11</Sum>
      </Payment>
      <Payment>
        <Acc>987654321</Acc>
        <Sum>222.11</Sum>
      </Payment>
    </a>
  </Payments>
</Root>



+ ожидаемый результат

<?xml version="1.0"?>
<Root>
  <p_Id>11</p_Id>
  <Payments>
    <Num>444</Num>
    <SumTotal>333.22</SumTotal>
    <Payment>
      <Acc>123456789</Acc>
      <Sum>111.11</Sum>
    </Payment>
    <Payment>
      <Acc>987654321</Acc>
      <Sum>222.11</Sum>
    </Payment>
  </Payments>
</Root>



Понимаю, что нельзя добавить бесконечный список "Payment" в xmlforest.
Может быть список элементов Payment можно как-то подзапросом вытащить?
XmlAgg можно объявить как "Payments", но нужны элементы "Num" и "SumTotal".

Сообщение было отредактировано: 22 июн 20, 14:29
22 июн 20, 14:30    [22155169]     Ответить | Цитировать Сообщить модератору
 Re: XmlAgg into XmlForest  [new]
123йй
Member

Откуда:
Сообщений: 1592
rnt777,
select xmlelement("Root",
                       xmlelement("p_Id", r.p_Id),
                       xmlelement("Payments",
                                  xmlelement("Num", ps.Num),
                                  xmlelement("SumTotal", ps.SumTotal),
                                  xmlagg(xmlelement("Payment",
                                                    xmlelement("Acc", p.Acc),
                                                    xmlelement("Sum", p.Sum))))) x
from   xP p, xPs ps, xR r
where  ps.P_Id = r.P_Id and
       p.Num = ps.Num
22 июн 20, 15:15    [22155184]     Ответить | Цитировать Сообщить модератору
 Re: XmlAgg into XmlForest  [new]
rnt777
Member

Откуда: Мгн
Сообщений: 12
123йй,

Легко и просто, спасибо! А то понесло меня в лес. Тему можно закрывать.

+
"Беги xmlforest, беги" отсюда
22 июн 20, 15:24    [22155195]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить