Oracle中listagg的替代方案?

Dat*_*ase 15 sql oracle varchar clob

listagg是Oracle 11.2中引入的一个函数!现在这个功能正在困扰我们分配,我们正在从MySQL迁移到Oracle,我们有这个查询:

SELECT
    p_id,
    MAX(registered) AS registered,
    listagg(MESSAGE, ' ') within GROUP (ORDER BY registered) AS MESSAGE
  FROM
    umm_parent_id_remarks_v m
  GROUP BY
    m.p_id;
Run Code Online (Sandbox Code Playgroud)

只要我们知道在Oracle下面有什么烦恼它就会返回VARCAR而不是我们需要的CLOB! 文字很大,我们确实需要它是CLOB!

这是我试图做的!

创建一个CLOB类型的CLOB_T表!

然后创建功能

create or replace
function listaggclob (t in clob_t) 
  return clob
as 
  ret clob := '';
  i   number;
begin
  i := t.first;
  while i is not null loop
    if ret is not null then
      ret := ret || ' ';
    end if;
    ret := ret || t(i);
    i := t.next(i);
  end loop;
  return ret;
end;
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行它:

  SELECT
        p_id,
        MAX(registered) AS registered,
        listaggclob(cast(collect (MESSAGE) as clob_t)) MESSAGE
      FROM
        umm_parent_id_remarks_v m
      GROUP BY
        m.p_id;
Run Code Online (Sandbox Code Playgroud)

我明白了

ORA-22814:属性或元素值大于类型中指定的值

它有什么解决方案吗?

谢谢

Ank*_*ani 5

使用xmlAgg,示例如下:

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') AS LIST
FROM tablename;
Run Code Online (Sandbox Code Playgroud)

这将返回 clob 值,因此无需创建自定义函数。