Нужна помощь в извлечении xmltype из базы данных - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть приведенная ниже таблица базы данных CASH с 5 столбцами:

REGISTER    DATE    CASE    BAG TYPE
1234    24-SEP-18   1123    112 A
1234    24-SEP-18   1124    113 S
1234    24-SEP-18   1123    116 S
1234    24-SEP-18   1124    117 A
7895    24-SEP-18   2568    119 A
7895    24-SEP-18   2568    118 S

Где номер регистра - это кассовые аппараты, которые могут иметь несколько CASE, связанных с ним, и каждый CASE может иметь более одного BAGи введите присоединенный к нему.

Что я хочу достичь, это как показано ниже:

<ROOT>
    <REGISTERS>
        <REGISTER>1234</REGISTER>
        <DATE>24-SEP-2018</DATE>
        <DETAILS>
            <BAG>1123</BAG>
            <DETAIl>
                <BAG>112</BAG>
                <TYPE>A</TYPE>
            </DETAIl>
            <DETAIl>
                <BAG>116</BAG>
                <TYPE>S</TYPE>
            </DETAIl>
        </DETAILS>
        <DETAILS>
            <BAG>1124</BAG>
            <DETAIl>
                <BAG>113</BAG>
                <TYPE>S</TYPE>
            </DETAIl>
            <DETAIl>
                <BAG>117</BAG>
                <TYPE>A</TYPE>
            </DETAIl>
        </DETAILS>
    </REGISTERS>
    <REGISTERS>
        <REGISTER>7895</REGISTER>
        <DATE>24-SEP-2018</DATE>
        <DETAILS>
            <BAG>2568</BAG>
            <DETAIl>
                <BAG>119</BAG>
                <TYPE>A</TYPE>
            </DETAIl>
            <DETAIl>
                <BAG>118</BAG>
                <TYPE>S</TYPE>
            </DETAIl>
        </DETAILS>
    </REGISTERS>
</ROOT>

Не могли бы вы дать несколько советов, как я могу добиться этого в запросе выбора базы данных Oracle?Я не хочу создавать хранимую процедуру и хочу добиться этого в запросе выбора.

1 Ответ

0 голосов
/ 24 сентября 2018

Во-первых, , пожалуйста, не используйте зарезервированные слова Oracle ("дата", "регистр", "тип") в качестве имен столбцов! Двойные кавычки для каждого имени столбца становятся утомительными.

Итак, это довольно сложный сценарий.Вы пытаетесь сделать 3 уровня агрегации на одной таблице.

Кроме того, функции Oracle XML дают вам ограниченную возможность создавать XML на лету в запросах.Единственный известный мне способ смешать данные столбца (xmlelement) и строки (xmlagg) на одном уровне иерархии XML - это объединить их с помощью конструктора xmlelement.

Кроме того, я предположил, что ваш "Тег / ROOT / REGISTERS / DETAILS / BAG "был опечаткой, и вы имели в виду" CASE ".

Но я думаю, это то, что вы просите.

create table cash (register number, "DATE" date, "CASE" number, bag number, "TYPE" varchar2(1));
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1123, 112, 'A');
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1124, 113, 'S');
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1123, 116, 'S');
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1124, 117, 'A');
insert into cash values (7895, to_date('09/24/2018', 'mm/dd/yyyy'), 2568, 119, 'A');
insert into cash values (7895, to_date('09/24/2018', 'mm/dd/yyyy'), 2568, 118, 'S');

select xmlelement("ROOT",
        xmlagg(xmlelement("REGISTERS",
                xmlelement("REGISTER", t1.register), 
                xmlelement("DATE", t1."DATE"),
                (select xmlagg(xmlelement("DETAILS",
                                 xmlelement("CASE", t2."CASE"),
                                 (select xmlagg(xmlelement("DETAIL",
                                                xmlforest(t3.bag, t3."TYPE"))
                                                )
                                    from (select bag, "TYPE" from cash 
                                          where cash."REGISTER" = t2."REGISTER" and cash."DATE" = t2."DATE"
                                            and cash."CASE" = t2."CASE") t3)
                               ))
                       from (select distinct register, "DATE", "CASE" from cash
                             where cash."REGISTER" = t1."REGISTER" and cash."DATE" = t1."DATE") t2
                       )
                )  
        )
    ) as xml_data
from (select distinct register, "DATE" from cash) t1
;

Выход:

<ROOT>
   <REGISTERS>
      <REGISTER>1234</REGISTER>
      <DATE>2018-09-24</DATE>
      <DETAILS>
         <CASE>1123</CASE>
         <DETAIL>
            <BAG>112</BAG>
            <TYPE>A</TYPE>
         </DETAIL>
         <DETAIL>
            <BAG>116</BAG>
            <TYPE>S</TYPE>
         </DETAIL>
      </DETAILS>
      <DETAILS>
         <CASE>1124</CASE>
         <DETAIL>
            <BAG>113</BAG>
            <TYPE>S</TYPE>
         </DETAIL>
         <DETAIL>
            <BAG>117</BAG>
            <TYPE>A</TYPE>
         </DETAIL>
      </DETAILS>
   </REGISTERS>
   <REGISTERS>
      <REGISTER>7895</REGISTER>
      <DATE>2018-09-24</DATE>
      <DETAILS>
         <CASE>2568</CASE>
         <DETAIL>
            <BAG>119</BAG>
            <TYPE>A</TYPE>
         </DETAIL>
         <DETAIL>
            <BAG>118</BAG>
            <TYPE>S</TYPE>
         </DETAIL>
      </DETAILS>
   </REGISTERS>
</ROOT>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...