как использовать group by в xmltable oracle - PullRequest
0 голосов
/ 31 декабря 2018

Когда я использую group by в таблице XML, возникает ошибка:

ORA-01422: точная выборка возвращает более одного запрошенного числа строк

Я пытался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;

Любое решение приветствуется.

1 Ответ

0 голосов
/ 31 декабря 2018

Ваш первый запрос в порядке, как изначально написано, однако, во втором блоке кода вы ввели предложение 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 записей.

...