4

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

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

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

4

2 回答 2

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

于 2009-12-28T03:30:18.700 回答
1

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

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

注意:直到最近我还在使用 9i,还没有研究 COLLECT。

于 2009-12-28T20:28:35.810 回答