如何调整LISTAGG以在选择查询中支持超过4000个字符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调整LISTAGG以在选择查询中支持超过4000个字符?相关的知识,希望对你有一定的参考价值。

Oracle Database 11g企业版11.2.0.2.0版 - 64位生产。

我有一个以下格式的表格。

Name     Department
Johny    Dep1
Jacky    Dep2
Ramu     Dep1

我需要以下格式的输出。

Dep1 - Johny,Ramu
Dep2 - Jacky

我尝试了'LISTAGG'功能,但有4000个字符的硬限制。由于我的db表很大,因此无法在应用程序中使用。另一种选择是使用

SELECT CAST(COLLECT(Name)

但我的框架允许我只执行选择查询而不执行PL / SQL脚本。因此我找不到使用COLLECT命令所需的“CREATE TYPE”命令创建类型的任何方法。

有没有其他方法可以使用select查询来实现上述结果?

答案

如果你不能创建类型(你不能只使用sql * plus来创建一个关闭?),但你可以使用COLLECT,然后使用内置数组。在RDBMS中有几个敲门声。运行此查询:

select owner, type_name, coll_type, elem_type_name, upper_bound, length 
 from all_coll_types
 where elem_type_name = 'VARCHAR2';

例如在我的数据库中,我可以使用sys.DBMSOUTPUT_LINESARRAY这是一个相当大的varray。

select department, 
       cast(collect(name) as sys.DBMSOUTPUT_LINESARRAY) 
  from emp 
 group by department;
另一答案

您应该添加GetClobVal并且还需要rtrim,因为它将在结果的末尾返回分隔符。

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') 
  ORDER BY colname).GetClobVal(),',') from tablename;
另一答案

@anuu_online的衍生物,但处理结果中的XML。

dbms_xmlgen.convert(xmlagg(xmlelement(E, name||',')).extract('//text()').getclobval(),1)
另一答案

我最后使用XMLAGG函数进行另一种方法,该函数没有4000的硬限制。

select department,
XMLAGG(XMLELEMENT(E,name||',')).EXTRACT('//text()')  
from emp 
group by department;
另一答案

对于IBM DB2,将结果转换为varchar(10000)将提供超过4000。

select column1, listagg(CAST(column2 AS VARCHAR(10000)), x'0A') AS "Concat column"...

以上是关于如何调整LISTAGG以在选择查询中支持超过4000个字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 listagg 运算符,以便查询应该获取逗号分隔的值

oracle 10g中listagg的替代品

LISTAGG 被评估并在无法访问的 case 语句中失败

直接从 Excel 中选择 AS400 查询记录

如何从 Opentype 字体的 GPOS 表中使用和提取字距调整对,以在 Java 中将字形正确显示为 Path2D?

如何编写 DB2 选择查询以在“-”分隔符之前包含字符串