anu*_*ine 5 casting collect oracle11g
Oracle Database 11g企业版11.2.0.2.0版 - 64位生产.
我有一个以下格式的表格.
Name Department
Johny Dep1
Jacky Dep2
Ramu Dep1
Run Code Online (Sandbox Code Playgroud)
我需要以下格式的输出.
Dep1 - Johny,Ramu
Dep2 - Jacky
Run Code Online (Sandbox Code Playgroud)
我尝试了'LISTAGG'功能,但有4000个字符的硬限制.由于我的db表很大,因此无法在应用程序中使用.另一种选择是使用
SELECT CAST(COLLECT(Name)
Run Code Online (Sandbox Code Playgroud)
但我的框架允许我只执行选择查询而不执行PL/SQL脚本.因此我找不到使用COLLECT命令所需的"CREATE TYPE"命令创建类型的任何方法.
有没有其他方法可以使用select查询来实现上述结果?
您应该添加GetClobVal并且还需要rtrim,因为它将在结果的末尾返回分隔符.
SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()')
ORDER BY colname).GetClobVal(),',') from tablename;
Run Code Online (Sandbox Code Playgroud)
如果你不能创建类型(你不能只使用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';
Run Code Online (Sandbox Code Playgroud)
例如,在我的数据库中,我可以使用sys.DBMSOUTPUT_LINESARRAY
哪个是相当大的varray.
select department,
cast(collect(name) as sys.DBMSOUTPUT_LINESARRAY)
from emp
group by department;
Run Code Online (Sandbox Code Playgroud)
@anuu_online 的衍生物,但处理结果中的 XML 转义。
dbms_xmlgen.convert(xmlagg(xmlelement(E, name||',')).extract('//text()').getclobval(),1)
Run Code Online (Sandbox Code Playgroud)