2009-12-28 18 views
4

我目前正在Crystal Reports中處理一個項目,該項目拒絕使用Oracle 10g允許的未公開的函數WM_CONCAT。 這裏是WM_CONCAT頭信息Oracle函數:複製wm_concat

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2 

要使用WM_CONCAT我通過了下列文件:WM_CONCAT(列1);該函數似乎接受一個varchar2類型的列,並返回列中值的逗號分隔列表。我目前有這個功能的自定義版本(在我的工作計算機上),但它不是最佳的,並且缺乏可重用性。任何人都可以提供一個很好的,可重用的函數,例如WM_CONCAT,我可以使用它嗎?

回答

8

當您使用wm_concat時是否收到錯誤消息? 與to_char之類的函數不同,它由wmsys擁有,您可能需要使用wmsys.wm_concat才能使用它。 (除非你創建了必要的同義詞)。

現在針對實際問題,

這種技術被稱爲字符串聚合。

你可以在這裏找到很多其他的選擇。

http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php 對於其他方法,尋找 「stragg」 上http://asktom.oracle.com 另一個有用的鏈接:http://www.orafaq.com/node/2290

這可能是最廣泛的一種。 很多團隊編寫自己的自定義函數,或多或少地執行相同的操作。

CREATE OR REPLACE FUNCTION get_employees (p_deptno in emp.deptno%TYPE) 
    RETURN VARCHAR2 
IS 
    l_text VARCHAR2(32767) := NULL; 
BEGIN 
    FOR cur_rec IN (SELECT ename FROM emp WHERE deptno = p_deptno) LOOP 
    l_text := l_text || ',' || cur_rec.ename; 
    END LOOP; 
    RETURN LTRIM(l_text, ','); 
END; 
/
SHOW ERRORS 

雖然此解決方案適用於varchar2和數量,但最好的通用解決方案可以使用Oracle ODCIAggregate接口構建。

http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm#sthref462

執行情況同樣是在上面的第一個鏈接www.oracle-base.com

+0

是的,我試着用wm_concat前綴wmsys,但仍然無法正常工作。感謝上面的代碼,但我更多地尋找一個GENERIC函數,它可以獨立於聯接或函數本身中的where子句使用。 – contactmatt 2009-12-28 16:31:38

+0

這是一個非常延遲的答案,但是當它寫到它時,我寫了一個類似上面的方法,因爲編寫「通用」方法花費了太多時間在我當前的項目中。 – contactmatt 2012-01-06 20:58:55

1

我已經解決了這個使用類似於最後一個Oracle的基礎文章中的技術:定義一個自定義的TABLE類型並編寫一個函數來將該類型的值聚合成一個字符串。我打電話給我的功能joinstr,然後你可以如下調用它:

SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',') 
FROM DUAL 

注:我是在9i中直到最近並沒有看着COLLECT呢。