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;
据我们所知,Oracle在MySQL下工作正常,在MySQL下运行良好,它会根据需要返回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;
现在,如果我运行它:
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;
我懂了
ORA-22814:属性或元素值大于类型中指定的值
有什么解决方案吗?
感谢您
使用collect或编写您自己的聚合函数。