zoukankan      html  css  js  c++  java
  • Oracle自定义聚合函数,仿wm_concat,返回CLOB类型

    因为数据库的wm_concat()函数返回的是VARCHAR2,但是我有个聚合操作,聚合后的参数长度超过4000,所以我需要写一个类似于wm_concat的函数,返回的是CLOB类型

    我的报错sql如下:

    下面讲解我的操作步骤:

    先以sys用户授权:

    grant execute on dbms_lob to xxx;

     

    第一步:

    第二步:

    第三步:

    第四步:

    第五步:

    sql如下:

    第一步:

     CREATE OR REPLACE TYPE typ_concat_clob AS OBJECT
    
    (
    
      concat_str CLOB,
    
      splitstr CLOB,
    
      --ODCIAggregateInitialize做一些初始化操作
    
      STATIC FUNCTION ODCIAggregateInitialize(cs_ctx In Out typ_concat_clob) return number,
    
      --ODCIAggregateIterate是主要的处理逻辑所在,这里定义一个迭代操作
    
      member function ODCIAggregateIterate(self In Out typ_concat_clob,srcvalue in VARCHAR2) return number,
    
      -- ODCIAggregateMerge是一个合并函数,如果在使用时指定了partition enabled,就必须定义此函数,用来把并行处理的结果进行合并
    
      member function ODCIAggregateMerge(self In Out typ_concat_clob,ctx2 In Out typ_concat_clob) return number,
    
      --ODCIAggregateTerminate是一个终止函数,顾名思义,在这个函数中对结果做最后处理并返回
    
      member function ODCIAggregateTerminate(self In Out typ_concat_clob,returnValue Out CLOB,flags IN NUMBER) return number
    
    ) 

    第二步:

    CREATE 
        OR REPLACE TYPE BODY typ_concat_clob IS STATIC FUNCTION ODCIAggregateInitialize ( cs_ctx IN OUT typ_concat_clob ) return NUMBER IS BEGIN
            cs_ctx := typ_concat_clob (
                to_clob( ',' ),
            to_clob( ',' ));
        RETURN ODCICONST.SUCCESS;
        
    END;
    member FUNCTION ODCIAggregateIterate ( self IN OUT typ_concat_clob, srcvalue IN VARCHAR2 ) return NUMBER IS BEGIN
        dbms_lob.append (
            self.concat_str,
        to_clob( srcvalue ));
        dbms_lob.append ( self.concat_str, self.splitstr );
        RETURN ODCICONST.SUCCESS;
        
    END;
    member FUNCTION ODCIAggregateMerge ( self IN OUT typ_concat_clob, ctx2 IN OUT typ_concat_clob ) return NUMBER IS BEGIN
        IF
            ctx2 IS NOT NULL THEN
                dbms_lob.append ( self.concat_str, ctx2.concat_str );
            
        END IF;
        RETURN ODCICONST.SUCCESS;
        
    END;
    member FUNCTION ODCIAggregateTerminate ( self IN OUT typ_concat_clob, returnValue OUT CLOB, flags IN NUMBER ) return NUMBER IS BEGIN
        dbms_lob.trim( self.concat_str, dbms_lob.getlength ( self.concat_str ) - 1 );
        self.concat_str := dbms_lob.substr( self.concat_str, dbms_lob.getlength ( self.concat_str ) - 1, 2 );
        returnValue := self.concat_str;
        RETURN ODCICONST.SUCCESS;
        
    END;
    
    END;
    
    /

    第三步:

    CREATE 
        OR REPLACE FUNCTION fun_concat_clob ( in_str VARCHAR2 ) RETURN CLOB AGGREGATE USING typ_concat_clob;
    
    /

    第四步:

    create table test_22 as(
    select fun_concat_clob('a') as id from dual 
    )

    使用和wm_concat一样,不同的是内部处理和返回值都是CLOB类型的。


  • 相关阅读:
    OAuth认证介绍及腾讯微博OAuth认证示例
    Android PopupWindow介绍及实现菜单效果
    Android 输入法键盘和activity页面遮挡问题解决
    eclipse中android项目的编译过程分析
    Android Tween动画之RotateAnimation实现图片不停旋转
    eclipse 文件同步插件
    关于移动Web应用程序开发 HTML5、高性能JavaScript篇、Css的几篇较好博客
    Android 记录和恢复ListView滚动的位置的三种方法
    Apache的功能模块
    如何防止自己网站的图片被其他网站所盗用,从而导致自己网站流量的损失【apache篇】
  • 原文地址:https://www.cnblogs.com/supiaopiao/p/14506384.html
Copyright © 2011-2022 走看看