Oracle数据库10g:收集,转换为字符串聚合

时间:2015-03-17 13:57:31

标签: sql oracle

我尝试使用collectcast进行字符串聚合,类似于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的解决方案。

1 个答案:

答案 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 || ','的值将被包装,最终将被丢弃。