Sql Oracle Database 10g:收集、转换用于字符串聚合
我试图使用Sql Oracle Database 10g:收集、转换用于字符串聚合,sql,oracle,Sql,Oracle,我试图使用collect和cast进行字符串聚合,类似于Oracle数据库11中的listag(不幸的是,我正在查询的数据库上没有启用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_
collect
和cast
进行字符串聚合,类似于Oracle数据库11中的listag
(不幸的是,我正在查询的数据库上没有启用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\u debug\u vc2coll
是varchar2(1000)的表类型。我想从每一行中删除SYS.DBMS\u DEBUG\u VC2COLL(VARCHAR(
),并简单地列出结果
有没有办法将生成的集合合并为字符串?此堆栈溢出与我要查找的内容类似…但是,我对该数据库具有只读访问权限。我还希望尝试将其保留为一个select语句
谢谢你的帮助
编辑:我不反对使用xmlagg
的解决方案。您可以使用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;
请注意,xmlement()
的第一个参数可以是任何东西,它只是一个XML标记,在该标记中,plan.acad|u plan | |',
的值将被包装,最终将被丢弃。您是否尝试过使用XMLAGG()
?是的,但是我没有得到相同的结果。你有任何可以指向我的链接/示例吗?请参阅。你可以使用COLLECT()
,但你需要编写一个函数来将表格结果转换为字符串。使用XMLAGG()可以看到这个问题的答案
:是的。我刚刚发现了这种方法。感谢您的帮助。唯一需要注意的是,如果生成的聚合字符串大于4000字节,则该方法可能不起作用。您知道为什么会有4000字节的限制吗?限制不在XMLAGG()
上,而是使用RTRIM()
,结果为XMLAGG()
,以及解决方案。