Oracle自定义聚集函数

-- 创建对象类型

CREATE OR REPLACE TYPE T_LINK AS OBJECT (
       STR VARCHAR2(30000),
       STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER,
       MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK,VALUE IN VARCHAR2) RETURN NUMBER,
       MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK,RETURNVALUE OUT VARCHAR2,FLAGS IN NUMBER) RETURN NUMBER,
       MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK,CTX2 IN T_LINK) RETURN NUMBER
       )
/

 

-- 建立包体

CREATE OR REPLACE TYPE BODY T_LINK IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER
IS
       BEGIN  
         SCTX := T_LINK(NULL);
         RETURN ODCICONST.SUCCESS;
       END;
MEMBER FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER
IS
       BEGIN
         SCTX.STR := SELF.STR || VALUE;
         RETURN  ODCICONST.SUCCESS;
       END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBE
R) RETURN NUMBER IS
   BEGIN
          RETURNVALUE :=SELF.STR;
          RETURN ODCICONST.SUCESS;
   END;
END;

/

 

-- 创建函数

CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2

       AGGREGATE USING T_LINK;

/

 

-- 建表

CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(20));

 

-- 使用F_LINK

SELECT ID, F_LINK(NAME) NAME FROM TEST GROUP BY ID;

 

你可能感兴趣的:(Oracle自定义聚集函数)