我尝试使用collect
和cast
进行字符串聚合,类似于Oracle Database 11中的listagg
(不幸的是,wm_concat
未启用在数据库中我查询)。我也对此数据库具有只读权限。
我目前的查询如下
SELECT plan.EMPLID,
plan.STRM TERM,
CAST(COLLECT(plan.ACAD_PLAN) AS sys.dbms_debug_vc2coll) agg_plans
FROM SYSADM.PS_OSR_PLAN_TRM plan
WHERE plan.EMPLID = '999999999'
GROUP BY plan.EMPLID, plan.STRM
这给了我这个结果:
EMPLID TERM AGG_PLANS
999999999 1152 SYS.DBMS_DEBUG_VC2COLL(VARCHAR(ECON-MN, TXTLCLO-MN))
999999999 1154 SYS.DBMS_DEBUG_VC2COLL(VARCHAR(ACCTING-BS, ECON-MN))
我相信我的逻辑是正确的,但我遇到了cast
声明的问题。我知道sys.dbms_debug_vc2coll
的类型为table of varchar2(1000)
。我想从每行中删除SYS.DBMS_DEBUG_VC2COLL(VARCHAR(
,只列出结果。
有没有办法将生成的集合连接成一个字符串?这个堆栈溢出post有类似于我正在寻找的东西......但是,我再一次只能访问这个数据库。我也想尝试保留一个选择陈述。
感谢您的帮助。
编辑:我不反对使用xmlagg
的解决方案。
答案 0 :(得分:1)
您可以使用XMLAGG()
,如下所示:
SELECT plan.emplid, plan.strm AS term
, RTRIM( XMLAGG( XMLELEMENT(e, plan.acad_plan || ',') ORDER BY plan.acad_plan ).EXTRACT('//text()'), ',' ) AS agg_plans
FROM sysadm.ps_osr_plan_trm plan
WHERE plan.emplid = '999999999'
GROUP BY plan.emplid, plan.strm;
请注意,XMLELEMENT()
的第一个参数可以是任何内容,它只是XML标记,其中plan.acad_plan || ','
的值将被包装,最终将被丢弃。