当前位置: 首页 > 面试题库 >

在Oracle中替代listagg?

寇宏义
2023-03-14
问题内容

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或编写您自己的聚合函数。



 类似资料:
  • 问题内容: 我是Oracle的新手。卡在下面:我有下面的2表: 地点: 人们: 现在在我的查询中,我想要这样的输出: 还有几点: -该解决方案应该在Oracle 10g和11g中都可以使用。 -为简洁起见,我在上面的示例中给出了一小部分数据,但是在我的产品场景中,一个Person可以与1000+个位置相关联,并且可以有1000+个这样的人,因此在这种情况下解决方案应该不会失败! 任何帮助将不胜感激

  • 问题内容: 我需要将Windows C ++项目转移到linux,但是我目前正在使用与linux或标准不兼容的MS 。您建议使用什么头替换它以便在Linux中使用?我希望答案也是跨平台的。 问题答案: 有一个基于NCurses的Linux替代版本的Conio.h。 http://sourceforge.net/projects/linux- conioh/

  • 问题内容: 我正在将MSSQL脚本转换为Oracle,但无法弄清楚使用变量代替表名或列的语法。 这是我尝试在Oracle SQL Developer中工作的一个简单示例,因此我可以更好地理解语法: 其中VR_TABLE是变量表名称,该变量表名称将在循环的每次迭代中更改。有人可以指出我做错了什么,还是可以将我链接到一个对我来说有用的网站?我已经阅读了一些有关此的教程,但是到目前为止,我还没有碰到任何

  • 问题内容: oracle一致性是否有任何开源替代方案? (顺便说一句,连贯性要花多少钱?) 问题答案: EhCache提供了不错的复制缓存,但与Coherence提供的功能集相去甚远。

  • 问题内容: 我需要一个脚本来创建表,或者如果它已经存在,则将其删除,并在重新创建表时将其删除。经过一些研究,我发现在pl / sql中不存在。所以我想出了这个脚本: 有没有适当的方法来实现此功能? 问题答案: 使用全局临时表似乎是一个更好的选择。但是,如果您坚持在运行时删除和重新添加表,则可以查询_TABLES视图之一(即USER_TABLES,DBA_TABLES,ALL_TABLES)以确定该

  • 问题内容: 我有一个顾客。 当将新行添加到此客户表时,如果新行的(主键)已经在客户表中,则我想使用其他字段对现有(旧)行进行更新。()。 否则(如果不在表中)插入新行。我知道我可以使用触发器在mssql中做到这一点。有没有一种方法可以在mysql中做到这一点。 问题答案: MySQL没有触发器,但是它具有REPLACE和INSERT … ON DUPLICATE KEY UPDATE (请参阅文档