Oracle XML с подзапросами - PullRequest
       0

Oracle XML с подзапросами

0 голосов
/ 15 февраля 2019

Я пытаюсь взять данные, хранящиеся в двух таблицах (отношения родитель / потомок), и сгенерировать форматированный XML в соответствии со спецификациями конкретного поставщика.Я потратил много времени на изучение функций Oracle XML и оставил запрос до последней части.Нижний колонтитул XML должен содержать общее количество.По какой-то причине я не могу заставить работать подзапрос здесь, как мне удалось в другом месте запроса.

Вот некоторые установочные данные:

create table chk_hdr (hdr_id number(4,0), chk_no number(3,0), chk_date date, chk_net_amt number(7,2), constraint pk_chk_hdr primary key (hdr_id));
create table chk_dtl (hdr_id number(4,0), dtl_id number(4,0), descr varchar2(30), descr2 varchar2(30), net_amt number(7,2), constraint pk_chk_dtl primary key (dtl_id), constraint fk_hdr_id foreign key (hdr_id) references chk_hdr(hdr_id));

insert into chk_hdr values (1000, 15, to_date('1/31/2019','MM/DD/YYYY'), 23.43);
insert into chk_hdr values (1001, 16, to_date('1/31/2019','MM/DD/YYYY'), 159.75);
insert into chk_dtl values (1000, 7000, 'Example 1.1', 'Example 1.1a', 10.01);
insert into chk_dtl values (1000, 7001, 'Example 1.2', 'Example 1.2a', 13.42);
insert into chk_dtl values (1001, 7002, 'Example 2.1', 'Example 2.1a', 65.12);
insert into chk_dtl values (1001, 7003, 'Example 2.2', 'Example 2.2a', 84.36); 
insert into chk_dtl values (1001, 7004, 'Example 2.3', 'Example 2.3a', 10.27);

Вот запрос, который работает как яза исключением нижнего колонтитула / "Трейлера":

SELECT dbms_xmlgen.convert(xmlserialize(document
                                        xmlelement("PrintChecks",
                                               xmlelement("Header",
                                                          xmlforest('test' AS "FileID",
                                                                    'description' AS "FileDescription",
                                                                    to_char(SYSDATE, 'YYYY-MM-DD') AS "FileGenDate",
                                                                    to_char(SYSDATE, 'HH24:MI:SS') AS "FileGenTime")),
                                               xmlelement("Checks",
                                                          xmlagg(xmlelement("Check",
                                                                            xmlforest(h.hdr_id AS "CheckID",
                                                                                      h.chk_no AS "CheckNumber",
                                                                                      h.chk_date AS "CheckDate",
                                                                                      h.chk_net_amt AS "CheckAmount"),
                                                                            xmlelement("InvoiceLines",
                                                                                       (SELECT xmlagg(xmlelement("InvoiceLine",
                                                                                                                 d.descr || ' | ' ||
                                                                                                                 d.descr2 || ' | ' ||
                                                                                                                 d.net_amt)
                                                                                                      ORDER BY d.descr)
                                                                                          FROM chk_dtl d
                                                                                         WHERE h.hdr_id = d.hdr_id))))),
                                               xmlelement("Trailer",
                                                          xmlforest('test' AS "FileID",
                                                                    '123' AS "TotalChecks",
                                                                    '123' AS "TotalAmount"))) version '1.0'),
                       1) xdoc
FROM chk_hdr h
WHERE h.chk_date = '31-JAN-2019';

Я также попытался отформатировать раздел "Трейлер", как показано ниже, который также работает:

xmlelement("Trailer",
           xmlelement("FileID", 'FileID Test'),
           xmlelement("TotalChecks", 123),
           xmlelement("TotalAmount", 123.45))) version '1.0'),

СВ разделе «Трейлер» мне нужно получить количество записей в таблице заголовков и сумму поля chk_net_amt.Я пробовал разные методы, но всегда получаю сообщение об ошибке: ORA-00937: не групповая функция для одной группы.Я даже пытался обернуть нижний колонтитул в операторе SELECT FROM DUAL, фактически не выбирая ничего, и все равно получил ошибку.

Вот пример чего-то, что я пробовал:

(select xmlelement("Trailer",
                   xmlelement("FileID", 'FileID Test'),
                   xmlelement("TotalChecks", count(h1.hdr_id)), 
                   xmlelement("TotalAmount", sum(h1.chk_net_amt))) 
 from chk_hdr h1 where h1.chk_date=h.chk_date )) version '1.0'),

Также не удается с тем жеошибка:

(select xmlelement("Trailer",
                   xmlelement("FileID", 'FileID Test'),
                   xmlelement("TotalChecks", 123),
                   xmlelement("TotalAmount", 123.45)) 
 from dual)) version '1.0'),

Использование Oracle 12.1.

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