天天看點

oracle自定義聚合函數

第一步: 實作 ODCIAggregate 接口(定義type、type body)
CREATE TYPE SpatialUnionRoutines(      
       STATIC FUNCTION ODCIAggregateInitialize( ... ) ...,      
    MEMBER FUNCTION ODCIAggregateIterate(...) ... ,      
    MEMBER FUNCTION ODCIAggregateMerge(...) ...,      
      MEMBER FUNCTION ODCIAggregateTerminate(...)      
);      
CREATE TYPE BODY SpatialUnionRoutines IS       
...      
END;      
第2步: 定義自定義函數
CREATE FUNCTION SpatialUnion(x Geometry) RETURN Geometry       
AGGREGATE USING SpatialUnionRoutines;      
第3: 使用自定義聚合函數
SELECT SpatialUnion(geometry) FROM counties GROUP BY state      

下面為具體例子:

1、定義type

create or replace type STRCAT_TYPE as object (

    CAT_STRING varchar2(4000),

    static Function ODCIAGGREGATEINITIALIZE (CS_CTX IN OUT strcat_type)

       return number,

    member Function ODCIAGGREGATEITERATE (SELF IN OUT strcat_type,VALUE IN varchar2)

       return number,

    member Function ODCIAGGREGATEMERGE (SELF IN Out strcat_type,CTX2 IN Out strcat_type)

       return number,

    member Function ODCIAGGREGATETERMINATE (SELF IN Out strcat_type,RETURNVALUE OUT varchar2,FLAGS IN number)

       return number

)

2、定義type body

create or replace type body STRCAT_TYPE as

   static Function ODCIAGGREGATEINITIALIZE (CS_CTX IN OUT strcat_type)

      return number as

      begin

            cs_ctx := strcat_type( null );

            return ODCIConst.Success;

        end;

   member Function ODCIAGGREGATEITERATE (SELF IN OUT strcat_type,VALUE IN varchar2)

      return number as

      begin

            --1. concat string

            self.cat_string := self.cat_string || ','|| value;

            -- 2.get union set

            -- if  instr(self.cat_string, value ) = 0 or self.cat_string is null then

            --        self.cat_string := self.cat_string || ',' || value ;

            -- else

            --        self.cat_string := self.cat_string ||'' ;

            -- end if ;

            return ODCIConst.Success;

        end;

   member Function ODCIAGGREGATEMERGE (SELF IN Out strcat_type,CTX2 IN Out strcat_type)

      return number as

      begin

            self.cat_string := self.cat_string || ',' || ctx2.cat_string;

            return ODCIConst.Success;

        end;

   member Function ODCIAGGREGATETERMINATE (SELF IN Out strcat_type,RETURNVALUE OUT varchar2,FLAGS IN number)

      return number as

      begin

            returnValue := ltrim(rtrim(self.cat_string,','),',');

            return ODCIConst.Success;

        end;

end;

3、定義函數

CREATE OR REPLACE FUNCTION strcat(input varchar2) RETURN varchar2

  PARALLEL_ENABLE

  AGGREGATE USING strcat_type;

以上最終效果如下:

 附一:具體表結構、資料如下:

oracle自定義聚合函數

附二:具體使用方法如下:

oracle自定義聚合函數