用一个实例讲解Oracle的自定义聚集函数
(网上找的,原地址不记得了,这里记载下,以后看)
Oracle数据库的定制功能十分强大。Oracle不但允许用户定制自己的函数,还可以定制自己的聚集函数和分析函数。
本文将着重介绍使用自定义聚集函数建立一个字符串“sum”的示例:
代码
SQL> 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
)
/
类型已创建。
SQL> 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
)
/
类型已创建。
代码
SQL> 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
SELF.STR := SELF.STR || VALUE;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
RETURNVALUE := SELF.STR;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE (SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS
BEGIN
NULL;
RETURN ODCICONST.SUCCESS;
END;
END;
/
类型主体已创建。
SQL> 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
SELF.STR := SELF.STR || VALUE;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
RETURNVALUE := SELF.STR;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE (SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS
BEGIN
NULL;
RETURN ODCICONST.SUCCESS;
END;
END;
/
类型主体已创建。
SQL> CREATE OR REPLACE FUNCTION F_LINK (P_STR VARCHAR2) RETURN VARCHAR2 AGGREGATE USING T_LINK;
/
函数已创建。
SQL> CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(20));
表已创建。
SQL> INSERT INTO TEST VALUES (1, 'AAA');
已创建 1 行。
代码
SQL> INSERT INTO TEST VALUES (2, 'BBB');
已创建 1 行。
SQL> INSERT INTO TEST VALUES (1, 'ABC');
已创建 1 行。
SQL> INSERT INTO TEST VALUES (3, 'CCC');
已创建 1 行。
SQL> INSERT INTO TEST VALUES (2, 'DDD');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> COL NAME FORMAT A60
SQL> SELECT ID, F_LINK(NAME) NAME FROM TEST GROUP BY ID;
ID NAME
---------- ------------------------------------------------------
1 AAAABC
2 BBBDDD
3 CCC
SQL> INSERT INTO TEST VALUES (2, 'BBB');
已创建 1 行。
SQL> INSERT INTO TEST VALUES (1, 'ABC');
已创建 1 行。
SQL> INSERT INTO TEST VALUES (3, 'CCC');
已创建 1 行。
SQL> INSERT INTO TEST VALUES (2, 'DDD');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> COL NAME FORMAT A60
SQL> SELECT ID, F_LINK(NAME) NAME FROM TEST GROUP BY ID;
ID NAME
---------- ------------------------------------------------------
1 AAAABC
2 BBBDDD
3 CCC