1

嗨,我在 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..

请指导我如何实现这一目标

4

2 回答 2

3

我知道这是一个老问题,但我想我会使用 Oracle 提供的功能提供解决方案,LISTAGG.

跑:

select listagg(ename || ' is a ' || job, ', ')
within group (order by job, ename)
from   emp
where  job in ('MANAGER','ANALYST','CLERK');

你会得到:

福特是分析师,斯科特是分析师,亚当斯是文员,詹姆斯是文员,米勒是文员,史密斯是文员,布莱克是经理,克拉克是经理,琼斯是经理

于 2014-05-16T13:49:29.273 回答
1

你必须逃避单引号

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

(顺便说一句。LISTAGG自 Oracle 11g 以来有一个新特性,您可能还想看看。)

于 2013-10-20T07:25:38.587 回答