Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle Database 10g:收集、转换用于字符串聚合_Sql_Oracle - Fatal编程技术网

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()
,以及解决方案。