2013-10-20 82 views
0

您好我有以下的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

請提供有關錯誤的精確信息 - 錯誤代碼,錯誤消息等。 – krokodilko

+0

錯誤消息是ora:00907 mi右括號 – user1837746

+0

errormessage有點誤導 - 在'ename'之後和'從'emp'之前沒有撇號 - 嘗試這個查詢:'SELECT STRING_AGGREGATE('select ename'||'Job'|| ||' 'FROM emp')ENAMES FROM DUAL;' – krokodilko

回答

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,您可能也想看看。)

+0

感謝所有工作 – user1837746

+0

現在這個查詢給我同樣的錯誤'SELECT DEPTNO,STRING_AGGREGATE('SELECT ENAME FROM EMP WHERE DEPTNO ='|| DEPTNO,'and job ='程序員')ENAME FROM EMP GROUP BY DEPTNO ORDER BY 1' – user1837746

+0

每次你在第一個和最後一個''之間都有一個''''時,你就必須像這個'''一樣加倍''''。好的?這意味着「逃脫」。另外我覺得'DEPTNO'有些問題。我認爲它應該是:'SELECT DEPTNO,STRING_AGGREGATE('SELECT ENAME FROM EMP WHERE DEPTNO ='|| DEPTNO ||'and job =''Programmer''')ENAME FROM EMP GROUP BY DEPTNO ORDER BY 1' – hol

2

我知道這是一個老問題,但我認爲我會使用Oracle交付的功能LISTAGG提供解決方案。

運行:

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

您將獲得:

FORD是分析師斯科特是一個分析師,ADAMS是一個祕書,詹姆斯是個祕書,米勒是個祕書,史密斯BLAKE是經理,CLARK是經理,JONES是經理