Oracle功能:复制wm_concat

时间:2009-12-28 02:50:57

标签: oracle function oracle10g string-aggregation wm-concat

我目前正在处理Crystal Reports中的一个项目,该项目拒绝使用Oracle 10g中允许的未记录的函数WM_CONCAT。 这是WM_CONCAT头信息

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

要使用WM_CONCAT,我将其传递给它:WM_CONCAT(column1);此函数似乎接受varchar2类型的列,并从列返回以逗号分隔的值列表。我目前有这个功能的自定义版本(在我的工作计算机上),但它不是最佳的,缺乏可重用性。任何人都可以提供一个好的,可重复使用的功能,如WM_CONCAT,我可以使用吗?

2 个答案:

答案 0 :(得分:8)

使用wm_concat时是否收到错误消息? 与to_char之类的函数不同,它由wmsys拥有,您可能需要使用wmsys.wm_concat来使用它。 (除非你创建必要的同义词当然)。

现在提出实际问题,

这种技术称为字符串聚合。

你可以在这里找到很多其他选择。

<强> http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php 对于其他方法,请在http://asktom.oracle.com上搜索“stragg” 另一个有用的链接: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和number,但可以使用Oracle ODCIAggregate接口构建最佳通用解决方案。

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

相同的实现在上面的第一个链接www.oracle-base.com

答案 1 :(得分:1)

我使用类似于oracle基础文章中的最后一种技术解决了这个问题:定义一个自定义TABLE类型并编写一个函数来将该类型的值聚合成一个字符串。我调用了我的函数joinstr,然后你可以按如下方式调用它:

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

注意:直到最近我一直在使用9i,还没有查看过COLLECT。