如何在xmltable oracle中使用group by

如何在xmltable oracle中使用group by,xml,oracle,plsql,group-by,xmltable,Xml,Oracle,Plsql,Group By,Xmltable,在XML表中使用groupby时,抛出错误: ORA-01422:精确获取返回多个请求的行数 我尝试使用listag()函数作为解决方案,但没有解决问题 我的SQL SELECT xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v1.column_1 as "id", v1.column_2 as "name")))).getclobval() INTO v_output FROM xmltable( '/l

在XML表中使用
groupby
时,抛出错误:

ORA-01422:精确获取返回多个请求的行数

我尝试使用listag()函数作为解决方案,但没有解决问题

我的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;
声明
在xml clob中:='
123456
456898
';
v_输出clob;
开始
选择xmlelement(“日志”,xmlagg(xmlelement(“日志”,xmlforest(v1.column_1为“id”,v1.column_2为“name”))))。getclobval()
输入v_输出
从xmltable(
“/logs/log”
传递xmltype(在xml中)
列id编号路径“id”
)x
在v1.id=x.id上连接视图v1
按v1.id分组;
dbms_output.put_行(v_output);
结束;

任何解决方案都是最受欢迎的。

您的第一个查询与最初编写的一样好,但是,在第二个代码块中,您引入了
group by
子句,这可能会使您的查询返回多个记录,但您正试图将它们选择到单个输出变量中

您需要将查询限制为单个ID,或者将v_输出更改为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;
声明
在xml clob中:='
123456
456898
';
t_型clob为clob表;
v_输出t_clob;
开始
选择xmlelement(“日志”,xmlagg(xmlelement(“日志”,xmlforest(v1.column_1为“id”,v1.column_2为“name”))))。getclobval()
批量收集到v_输出中
从xmltable(
“/logs/log”
传递xmltype(在xml中)
列id编号路径“id”
)x
在v1.id=x.id上连接视图v1
按v1.id分组
只取前10行;
国际热核聚变实验堆的v_输出。。v_输出最后一个循环
dbms_output.put_行(v_output);
端环;
结束;

对于上面的代码应该谨慎一些,因为如果在v_输出中选择了大量行,那么在没有获取限制的情况下,它可能会耗尽可用内存。当前写入时,仅检索并写出前10条记录。

HI Senetial仍在输出中,存在重复记录