Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          Oracle自定義聚集函數(shù)
          ?
          ?
          ??? 在yangtingkun博客上看到很早以前的一篇文章,是用一個type來自定義聚集函數(shù)的,覺得非常神奇,想想用普通的函數(shù)定義還真的是不能滿足需求,只能用Oracle的說明來做。開始死活看不懂這個type定義的原理,發(fā)現(xiàn)參數(shù)傳入傳出的好麻煩,后來在網(wǎng)上找了Oracle的文檔,發(fā)現(xiàn)這是Oracle規(guī)定的固定格式,而且函數(shù)名也是確定的,貌似這樣才能依次調(diào)用。下面簡單了解一下:
          ?
          ??? 關(guān)于函數(shù)的介紹看這里: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14289/dciaggref.htm#BABCFHFB
          ??? 具體的介紹看這里:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14289/dciaggfns.htm
          ?
          ?
          ??? 總體感覺就是一個固定模式的套用,只要簡單記一下用法就可以了。而且Oracle文檔上也沒有太具體的描述。看個例子(轉(zhuǎn)載):
          ?
          對字符串的“sum”——在Oracle中自定義聚集函數(shù)的例子
          ===========================================================
          作者: yangtingkun(http://yangtingkun.itpub.net)
          發(fā)表于: 2004.10.19 17:59
          分類: ORACLE
          出處: http://yangtingkun.itpub.net/post/468/3380
          ---------------------------------------------------------------
          Oracle的定制功能十分強大。前幾天在碰到一個問題的時候,查詢文檔發(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 NUMBER) 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 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? /
          ?
          類型主體已創(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
          ?
          ?
          ?
          附:如果關(guān)于type的一些基礎(chǔ)用法,可以參見此處:http://blog.chinaunix.net/u/20762/showart_329455.html
          posted on 2009-06-26 21:43 decode360 閱讀(555) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
          主站蜘蛛池模板: 林口县| 昌宁县| 石阡县| 万年县| 安庆市| 韶山市| 壤塘县| 马鞍山市| 桦川县| 珠海市| 观塘区| 禹州市| 永福县| 扎兰屯市| 万源市| 乌拉特中旗| 孟州市| 宝鸡市| 桃园市| 高密市| 武汉市| 库车县| 疏勒县| 旬邑县| 双峰县| 太康县| 利辛县| 兴隆县| 北辰区| 新竹市| 皋兰县| 麻栗坡县| 濮阳县| 平顺县| 天全县| 通道| 井研县| 九江市| 揭东县| 黑龙江省| 商南县|