Oracle 行拼接 wmsys.wm_concat扩展

将多行数据拼接成一行:

--wmsys.wm_concat
select wmsys.wm_concat(a.hdid) as test from flow_currentrecord a where a.flowid=222 group by a.flowid;

但有大小限制:字符串缓冲区太小,超过varchar 4000长度。
扩展:更改返回类型为clob

--Type 
CREATE OR REPLACE TYPE zh_concat_im AUTHID CURRENT_USER AS OBJECT 
( 
  CURR_STR clob, 
  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) 
    RETURN NUMBER, 
  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im, 
                                       P1   IN VARCHAR2) RETURN NUMBER, 
  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN zh_concat_im, 
                                         RETURNVALUE OUT clob, 
                                         FLAGS       IN NUMBER) 
    RETURN NUMBER, 
  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF  IN OUT zh_concat_im, 
                                     SCTX2 IN zh_concat_im) RETURN NUMBER 
); 
/ 
--TYPE BODY 
CREATE OR REPLACE TYPE BODY zh_concat_im IS
  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) 
    RETURN NUMBER IS
  BEGIN
    SCTX := zh_concat_im(NULL); 
    RETURN ODCICONST.SUCCESS; 
  END; 
  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im, 
                                       P1   IN VARCHAR2) RETURN NUMBER IS
  BEGIN
    IF (CURR_STR IS NOT NULL) THEN
      CURR_STR := CURR_STR || ',' || P1; 
    ELSE
      CURR_STR := P1; 
    END IF; 
    RETURN ODCICONST.SUCCESS; 
  END; 
  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN zh_concat_im, 
                                         RETURNVALUE OUT clob, 
                                         FLAGS       IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURNVALUE := CURR_STR; 
    RETURN ODCICONST.SUCCESS; 
  END; 
  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF  IN OUT zh_concat_im, 
                                     SCTX2 IN zh_concat_im) RETURN NUMBER IS
  BEGIN
    IF (SCTX2.CURR_STR IS NOT NULL) THEN
      SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR; 
    END IF; 
    RETURN ODCICONST.SUCCESS; 
  END; 
END;  
/ 
--FUNCTION  
create or replace FUNCTION zh_concat(P1 VARCHAR2) RETURN clob AGGREGATE USING zh_concat_im;

调用:

select zh_concat(a.hdid) as test from flow_currentrecord a where a.flowid=222 group by a.flowid;

 

 

posted on 2013-12-17 12:50  顺风车  阅读(942)  评论(0)    收藏  举报