Oracle自定義聚集函數(shù)
?
?
??? 在yangtingkun博客上看到很早以前的一篇文章,是用一個(gè)type來(lái)自定義聚集函數(shù)的,覺(jué)得非常神奇,想想用普通的函數(shù)定義還真的是不能滿(mǎn)足需求,只能用Oracle的說(shuō)明來(lái)做。開(kāi)始死活看不懂這個(gè)type定義的原理,發(fā)現(xiàn)參數(shù)傳入傳出的好麻煩,后來(lái)在網(wǎng)上找了Oracle的文檔,發(fā)現(xiàn)這是Oracle規(guī)定的固定格式,而且函數(shù)名也是確定的,貌似這樣才能依次調(diào)用。下面簡(jiǎn)單了解一下:
?
??? 關(guān)于函數(shù)的介紹看這里:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14289/dciaggref.htm#BABCFHFB
?
?
??? 總體感覺(jué)就是一個(gè)固定模式的套用,只要簡(jiǎn)單記一下用法就可以了。而且Oracle文檔上也沒(méi)有太具體的描述。看個(gè)例子(轉(zhuǎn)載):
?
對(duì)字符串的“sum”——在Oracle中自定義聚集函數(shù)的例子
===========================================================
作者: yangtingkun(http://yangtingkun.itpub.net)
發(fā)表于: 2004.10.19 17:59
分類(lèi): ORACLE
出處: http://yangtingkun.itpub.net/post/468/3380
---------------------------------------------------------------
Oracle的定制功能十分強(qiáng)大。前幾天在碰到一個(gè)問(wèn)題的時(shí)候,查詢(xún)文檔發(fā)現(xiàn),oracle不但允許用戶(hù)定制自己的函數(shù),還可以定制自己的聚集函數(shù)和分析函數(shù)。
===========================================================
作者: yangtingkun(http://yangtingkun.itpub.net)
發(fā)表于: 2004.10.19 17:59
分類(lèi): ORACLE
出處: http://yangtingkun.itpub.net/post/468/3380
---------------------------------------------------------------
Oracle的定制功能十分強(qiáng)大。前幾天在碰到一個(gè)問(wèn)題的時(shí)候,查詢(xún)文檔發(fā)現(xiàn),oracle不但允許用戶(hù)定制自己的函數(shù),還可以定制自己的聚集函數(shù)和分析函數(shù)。
?
下面是我使用自定義聚集函數(shù)建立一個(gè)字符串“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 NUMBER) RETURN NUMBER,
? 6? MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER
? 7? )
? 8? /
?
類(lèi)型已創(chuàng)建。
?
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 NUMBER) 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? /
? 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 NUMBER) 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? /
?
類(lèi)型主體已創(chuàng)建。
?
SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2
? 2? AGGREGATE USING T_LINK;
? 3? /
? 2? AGGREGATE USING T_LINK;
? 3? /
?
函數(shù)已創(chuàng)建。
?
SQL> CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(20));
?
表已創(chuàng)建。
?
SQL> INSERT INTO TEST VALUES (1, 'AAA');
?
已創(chuàng)建 1 行。
?
SQL> INSERT INTO TEST VALUES (2, 'BBB');
?
已創(chuàng)建 1 行。
?
SQL> INSERT INTO TEST VALUES (1, 'ABC');
?
已創(chuàng)建 1 行。
?
SQL> INSERT INTO TEST VALUES (3, 'CCC');
?
已創(chuàng)建 1 行。
?
SQL> INSERT INTO TEST VALUES (2, 'DDD');
?
已創(chuàng)建 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
---------- ------------------------------------------------------
???????? 1 AAAABC
???????? 2 BBBDDD
???????? 3 CCC
?
?
?
附:如果關(guān)于type的一些基礎(chǔ)用法,可以參見(jiàn)此處:http://blog.chinaunix.net/u/20762/showart_329455.html