Когда я использую group by в таблице XML, он выдает ошибку:
ORA-01422: exact fetch returns more than one requested number of rows
Я попробовал использовать функцию LISTAGG () в качестве решения, но это не помогло.
Мой SQL
SELECT xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v1.column_1 as "id", v1.column_2 as "name")))).getclobval()
INTO v_output
FROM xmltable( '/logs/log' passing xmltype(in_xml) columns id number path
'id' ) x
JOIN view v1
ON v1.id= x.id;
Введите xml
declare
in_xml clob := '<?xml version = "1.0" encoding = "UTF-8"?>
<logs>
<log>
<id>123456</id>
</log>
<log>
<id>456898</id>
</log>
</logs>';
v_output clob;
begin
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v1.column_1 as "id", v1.column_2 as "name")))).getclobval()
into v_output
from xmltable(
'/logs/log'
passing xmltype(in_xml)
columns id number path 'id'
) x
join view v1 on v1.id = x.id
GROUP BY v1.id;
dbms_output.put_line (v_output);
end;
Любое решение приветствуется.





Ваш первый запрос в порядке, как это было изначально написано, однако во втором блоке кода вы ввели предложение group by, которое может заставить ваш запрос возвращать несколько записей, но вы пытаетесь выбрать их в одну выходную переменную.
Вам нужно либо ограничить свой запрос одним идентификатором, либо изменить v_output на коллекцию значений clob и использовать массовые операции:
declare
in_xml clob := '<?xml version = "1.0" encoding = "UTF-8"?>
<logs>
<log>
<id>123456</id>
</log>
<log>
<id>456898</id>
</log>
</logs>';
type t_clob is table of clob;
v_output t_clob;
begin
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v1.column_1 as "id", v1.column_2 as "name")))).getclobval()
bulk collect into v_output
from xmltable(
'/logs/log'
passing xmltype(in_xml)
columns id number path 'id'
) x
join view v1 on v1.id = x.id
GROUP BY v1.id
fetch first 10 rows only;
for iter in v_output.first .. v_output.last loop
dbms_output.put_line (v_output);
end loop;
end;
Следует проявлять осторожность с приведенным выше кодом, поскольку он может, без ограничения выборки, потенциально исчерпать доступную память, если в v_output выбрано большое количество строк. В настоящее время будут извлечены и записаны только первые 10 записей.
HI Senetial все еще находится в выходной дублирующей записи.