5

Oracle 数据库 11g 企业版 11.2.0.2.0 - 64 位生产。

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

Name     Department
Johny    Dep1
Jacky    Dep2
Ramu     Dep1

我需要以下格式的输出。

Dep1 - Johny,Ramu
Dep2 - Jacky

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

SELECT CAST(COLLECT(Name)

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

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

4

5 回答 5

8

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

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') 
  ORDER BY colname).GetClobVal(),',') from tablename;
于 2015-03-13T10:58:56.427 回答
6

如果您不能创建类型(您不能只使用 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一个相当大的可变数组。

select department, 
       cast(collect(name) as sys.DBMSOUTPUT_LINESARRAY) 
  from emp 
 group by department;
于 2013-03-28T11:25:08.703 回答
5

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

dbms_xmlgen.convert(xmlagg(xmlelement(E, name||',')).extract('//text()').getclobval(),1)
于 2014-04-15T19:17:21.530 回答
4

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

select column1, listagg(CAST(column2 AS VARCHAR(10000)), x'0A') AS "Concat column"...
于 2018-03-26T10:18:48.360 回答
3

我最终采用了另一种方法,使用没有硬限制 4000 的 XMLAGG 函数。

select department,
XMLAGG(XMLELEMENT(E,name||',')).EXTRACT('//text()')  
from emp 
group by department;
于 2013-03-28T19:20:50.033 回答