emp:
  id 
  name
  depart,1   scott   1
2   tiger   1
3   manager 1比方说,select str_link(t.name) from emp t where t.depart = 1,
我要查出来的结果是scott,tiger,manager。搜了半天google,不知道怎么用关键字,看各位有么有遇到有这种需求的。

解决方案 »

  1.   

    用到公司有一个函数,就是str_link,可能查询的数量巨大,报:字符的缓冲区太小,我不知道这个函数,是oracle自带的,还是,同事写的,我贴上来,给各位看看:CREATE OR REPLACE TYPE BODY SYS.strlink IS
      STATIC FUNCTION ODCIAggregateInitialize (
        sctx IN OUT strlink
      )
        RETURN NUMBER
      IS
      BEGIN
        sctx := strlink(NULL);
        RETURN ODCICONST.SUCCESS;
      END;  MEMBER FUNCTION ODCIAggregateIterate (
        self IN OUT STRLINK,
        value IN VARCHAR2
      )
        RETURN NUMBER
      IS
      BEGIN
        IF self.str IS NULL THEN
          self.str := value;
        ELSE
          self.str := self.str || ',' || value;    END IF;
        RETURN ODCICONST.SUCCESS;
      END;  MEMBER FUNCTION ODCIAggregateTerminate (
        self IN strlink,
        value OUT VARCHAR2,
        flags IN NUMBER
      )
        RETURN NUMBER
      IS
      BEGIN
        value := self.str;
        RETURN ODCICONST.SUCCESS;
      END;  MEMBER FUNCTION ODCIAggregateMerge (
        self IN OUT strlink,
        ctx2 IN STRLINK
      )
        RETURN NUMBER
      IS
      BEGIN
        NULL;
        RETURN ODCICONST.SUCCESS;
      END;
    END;
      

  2.   

    select deptno,wm_concat(ename) from emp group by deptno;
    DEPTNO WM_CONCAT(ENAME)
    ------ --------------------------------------------------------------------------------
        10 CLARK,KING,MILLER
        20 SMITH,FORD,ADAMS,SCOTT,JONES
        30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
      

  3.   

    select depart,wm_concat(name)
    from emp
    group by depart
      

  4.   

    恩,这个是可以的,请教一下,我刚刚贴的那个函数str_link是系统自带的吗?
      

  5.   


    呵呵,是我写sql太大意了,我引用内层循环的变量名字和外层循环判断的字段相同,我改了内层变量名就可以了。
    如下:
    select city,(
    select ***
    from table a
    where a.city = city)
    from (
    city,xxxxxxxxxxxxxxxxxxxx
    ),重点出错在select ***
    from table a
    where a.city = city,这会导致死循环,然后,我把内层的city改为citya,然后内层改为
    select ***
    from table a
    where a.city = citya,然后就可以了。
      

  6.   

    不是自带的  oracle中函数wm_concat()和over()函数用处都比较多 可以多看下
      

  7.   

    11gr2之前可以用wm_concat(),11gr2之后可以用LISTAGG函数替代wm_concat函数。
    和wm_concat相比,listagg可以执行排序,例如
    select deptno, listagg(ename,';') within group(order by ename) enames from emp group by deptno;