yangtingkun
===========================================================
对字符串的“sum”——在Oracle中自定义聚集函数的例子
===========================================================

Oracle的定制功能十分强大。前几天在碰到一个问题的时候,查询文档发现,oracle不但允许用户定制自己的函数,还可以定制自己的聚集函数和分析函数。

下面是我使用自定义聚集函数建立一个字符串“sum”的小例子。

 


SQL> CREATE OR REPLACE TYPE T_LINK AS OBJECT (
  2  STR VARCHAR2(30000),
  3  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER,
  4  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER,
  5  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBE
R) RETURN NUMBER,
  6  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER
  7  )
  8  /

类型已创建。

SQL> CREATE OR REPLACE TYPE BODY T_LINK IS
  2  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER IS
  3  BEGIN
  4  SCTX := T_LINK(NULL);
  5  RETURN ODCICONST.SUCCESS;
  6  END;
  7 
  8  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER IS
  9  BEGIN
 10  SELF.STR := SELF.STR || VALUE;
 11  RETURN ODCICONST.SUCCESS;
 12  END;
 13  
 14  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBE
R) RETURN NUMBER IS
 15  BEGIN
 16  RETURNVALUE := SELF.STR;
 17  RETURN ODCICONST.SUCCESS;
 18  END;
 19 
 20  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS
 21  BEGIN
 22  NULL;
 23  RETURN ODCICONST.SUCCESS;
 24  END;
 25  END;
 26  /

类型主体已创建。

SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2
  2  AGGREGATE USING T_LINK;
  3  /

函数已创建。

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

yangtingkun 发表于:2004.10.19 17:59 ::分类: ( ORACLE ) ::阅读:(8441次) :: 评论 (6)
re: 对字符串的“sum”——在Oracle中自定义聚集函数的例子 [回复]

SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2
2 AGGREGATE USING T_LINK;
3 /
报:
PLS-00103: Encountered the symbol "AGGREGATE" when expecting one
of the following:
; is authid deterministic parallel_enable as

woodgate 评论于: 2007.04.24 15:12
re: 对字符串的“sum”——在Oracle中自定义聚集函数的例子 [回复]

怀疑楼上的数据库是8i的

yangtingkun 评论于: 2007.04.25 13:42
re: 对字符串的“sum”——在Oracle中自定义聚集函数的例子 [回复]

谢谢yang版主,今天有个需求正好用到了这个功能,赞一下!

bluemoon0083 评论于: 2008.03.03 14:40
re: 对字符串的“sum”——在Oracle中自定义聚集函数的例子 [回复]

自定义聚合函数比用SYS_CONNECT_BY_PATH的方法快很多!应该是不用特意构造rownum的缘故吧

bluemoon0083 评论于: 2008.03.03 14:44
re: 对字符串的“sum”——在Oracle中自定义聚集函数的例子 [回复]

对于这个方法就是一个全表扫描的过程。

而对于构造方法,不但先要构造想要的结构,还需要进行树形查询,效率当然会低。

yangtingkun 评论于: 2008.03.05 11:15
re: 对字符串的“sum”——在Oracle中自定义聚集函数的例子 [回复]

自定义聚集函数,也可以在9i的数据库上进行.

jidongzheng 评论于: 2009.05.19 14:12

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...