Я пытаюсь взять данные, хранящиеся в двух таблицах (отношения родитель / потомок), и сгенерировать форматированный 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.