暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle自定义聚合函数

数据老匠 2016-08-26
1130


1、创建自定义聚合函数接口

CREATE OR REPLACE TYPE TYPE_AGG AS OBJECT

(

  BASEVALUE NUMBER,

  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT TYPE_AGG)

         RETURN NUMBER,

  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF  IN OUT TYPE_AGG,

                                       VALUE IN NUMBER) 

         RETURN NUMBER,

  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT TYPE_AGG,

                                     CTX2 IN TYPE_AGG) 

         RETURN NUMBER,

  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN TYPE_AGG,

                                         RETURNVALUE OUT NUMBER,

                                         FLAGS       IN NUMBER)

         RETURN NUMBER

)


2、实现自定义聚合函数

CREATE OR REPLACE TYPE BODY TYPE_AGG IS

      --实现过程

END;


3、函数绑定

CREATE OR REPLACE FUNCTION Fun_Name(paras VARCHAR2) RETURN NUMBER

       AGGREGATE USING TYPE_AGG;

CREATE OR REPLACE FUNCTION Fun_Name(paras VARCHAR2) RETURN NUMBER

       PARALLEL_ENABLE AGGREGATE USING TYPE_AGG;--有并行处理




自定义sum函数

创建T_SUM:

CREATE OR REPLACE TYPE T_SUM AS OBJECT

(

    BASEVALUE NUMBER,

    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_SUM) RETURN NUMBER,

    MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_SUM, VALUE IN NUMBER) RETURN NUMBER,

    MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN T_SUM,

                                           RETURNVALUE OUT NUMBER,

                                           FLAGS       IN NUMBER) RETURN NUMBER,

    MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_SUM, CTX2 IN T_SUM) RETURN NUMBER

)


创建T_SUM包体:

create or replace type body T_SUM is

    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_SUM) RETURN NUMBER IS

    BEGIN

        SCTX := T_SUM(NULL);

        RETURN ODCICONST.SUCCESS;

    END;  

  

    MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_SUM, VALUE IN NUMBER) RETURN NUMBER IS

    BEGIN

        SELF.BASEVALUE := nvl(SELF.BASEVALUE,0) + VALUE;

        RETURN ODCICONST.SUCCESS;

    END;

    

    MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_SUM, CTX2 IN T_SUM) RETURN NUMBER IS

    BEGIN

        SELF.BASEVALUE := SELF.BASEVALUE + CTX2.BASEVALUE;

        RETURN ODCICONST.SUCCESS;

    END;

    

    MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN T_SUM,

                                           RETURNVALUE OUT NUMBER,

                                           FLAGS       IN NUMBER) RETURN NUMBER IS

    BEGIN

        RETURNVALUE := SELF.BASEVALUE;

        RETURN ODCICONST.SUCCESS;

    END;

end;


绑定TYPE:

CREATE OR REPLACE FUNCTION SUM_AGG(p_num NUMBER) RETURN NUMBER

   PARALLEL_ENABLE AGGREGATE USING T_SUM;



文章转载自数据老匠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论