oracle中,行转列函数wm_concat()结果有长度限制,重写该函数解决


 

--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;

首先创建一个Type,一个Type Body,最后利用该Type和Type Body 创建一个返回类型为Clob的function,返回的结果是中间用逗号隔开的clob字段,如下图所示:

select zh_concat(distinct(t.standardsort)) standardsort from TB_SD_STANDARD_CHOOSE_ADVISE t

结果如下:

在后台操作获取该clob字段的内容如以下代码所示:

BufferedReader in = null;
                            StringWriter out = null;
                            String content = "";
                            try {
                                Clob clob = (Clob)objs[5];
                                in = new BufferedReader(clob.getCharacterStream());
                                out = new StringWriter();
                                int c;
                                while ((c = in.read()) != -1) {
                                    out.write(c);
                                }
                                content = out.toString();
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                in.close();
                                out.close();
                            }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM