嗨,我在oracle中有以下字符串聚合功能
CREATE OR REPLACE FUNCTION STRING_AGGREGATE(i_query VARCHAR2,
i_seperator VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
AS
l_return CLOB:='';
l_temp VARCHAR(32000);
TYPE r_cursor is REF CURSOR;
rc r_cursor;
BEGIN
OPEN rc FOR i_query;
LOOP
FETCH rc
INTO L_TEMP;
EXIT WHEN RC%NOTFOUND;
l_return:=l_return||L_TEMP||i_seperator;
END LOOP;
RETURN RTRIM(l_return,i_seperator);
END;
当我调用此函数时,它显示如下
SELECT STRING_AGGREGATE('select ename from emp') ENAMES FROM DUAL;
ENAMES
---------------------------
SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,JAMES,FORD,MILLER
这个函数在这里工作得很好但是当我用多个空格调用这个函数时它给我的错误这里是我的查询
SELECT STRING_AGGREGATE('select ename||' Job is '||Job from emp') ENAMES FROM DUAL;
我想得到结果
smith job is clerk,allen job is accountatnt,ward job is programmer etc..
请指导我如何实现这个
答案 0 :(得分:2)
我知道这是一个老问题,但我想我会使用Oracle提供的函数LISTAGG
来提供解决方案。
执行命令
select listagg(ename || ' is a ' || job, ', ')
within group (order by job, ename)
from emp
where job in ('MANAGER','ANALYST','CLERK');
你会得到:
FORD是ANALYST,SCOTT是ANALYST,ADAMS是CLERK,JAMES是CLERK,MILLER是CLERK,SMITH是CLERK,BLAKE是MANAGER,CLARK是MANAGER,JONES是MANAGER
答案 1 :(得分:0)
你必须逃避单引号
SELECT STRING_AGGREGATE('select ename||'' Job is ''||Job from emp') ENAMES FROM DUAL;
您可以尝试将字符串传递给函数,如下所示
SELECT 'select ename||'' Job is ''||Job from emp' FROM DUAL;
给你
select ename||' Job is '||Job from emp
请参阅演示:http://sqlfiddle.com/#!2/d41d8/23283
(顺便说一句。自Oracle 11g以来有一个新功能LISTAGG
,你可能也想看一下。)