Oracle的定制功能十分強(qiáng)大。前幾天在碰到一個問題的時候,查詢文檔發(fā)現(xiàn),oracle不但允許用戶定制自己的函數(shù),還可以定制自己的聚集函數(shù)和分析函數(shù)。
下面是我使用自定義聚集函數(shù)建立一個字符串“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 /
類型已創(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 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 /
類型主體已創(chuàng)建。
SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2
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