代码之家  ›  专栏  ›  技术社区  ›  contactmatt

Oracle函数:复制wm_concat

  •  4
  • contactmatt  · 技术社区  · 16 年前

    我目前正在Crystal Reports中的一个项目中工作,该项目拒绝使用Oracle10g中允许使用的未记录函数wm_concat。 这是wm_concat头信息

    WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2
    

    要使用wm_concat,请传递以下内容:wm_concat(column1);此函数似乎接受varchar2类型的列,并从该列返回以逗号分隔的值列表。我现在有一个这个函数的自定义版本(在我的工作计算机上),但它不是最佳的,缺乏可重用性。有谁能提供一个好的,可重复使用的功能,比如我可以使用的wm_concat?

    2 回复  |  直到 10 年前
        1
  •  8
  •   Rajesh Chamarthi    16 年前

    使用wm_concat时是否收到错误消息? 与类似于“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和number,但最好的通用解决方案可以使用Oracle Odciaggregate接口构建。

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

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

        2
  •  1
  •   Dan    16 年前

    我使用类似于Oracle基础文章中最后一个的技术来解决这个问题:定义一个自定义 TABLE 键入并编写一个函数,将该类型的值聚合到字符串中。我调用了我的函数 joinstr 然后你可以这样称呼它:

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

    注:我最近才9点,还没有调查过收藏品。

    推荐文章