【发布时间】:2012-02-23 11:51:56
【问题描述】:
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;
据我们所知,在 MySQL 中运行良好 在 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;
现在如果我运行它:
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:属性或元素值大于类型中指定的值
有什么解决办法吗?
谢谢你
【问题讨论】: