zoukankan      html  css  js  c++  java
  • 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();
                                }
  • 相关阅读:
    关于 JLRoutes
    关于Objection 框架或解耦合方案
    窥探 NSObject
    关于cocoa 运行时runtime
    关于 cocoapods 使用
    关于Xcode 遇到的 警告、错误 处理
    ios 中正则匹配 ,NSPredicate
    关于状态栏 上颜色配置 ios7.x 之后
    使用ios系统侧滑 7.x 之后
    常用的shell脚本
  • 原文地址:https://www.cnblogs.com/lowerCaseK/p/wm_concat_limit.html
Copyright © 2011-2022 走看看