(网上找的,原地址不记得了,这里记载下,以后看)
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