`
piperzero
  • 浏览: 3474824 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Oracle自定义聚集函数

 
阅读更多
在yangtingkun博客上看到很早以前的一篇文章,是用一个type来自定义聚集函数的,觉得非常神奇,想想用普通的函数定义还真的是不能满足需求,只能用Oracle的说明来做。开始死活看不懂这个type定义的原理,发现参数传入传出的好麻烦,后来在网上找了Oracle的文档,发现这是Oracle规定的固定格式,而且函数名也是确定的,貌似这样才能依次调用。下面简单了解一下:
总体感觉就是一个固定模式的套用,只要简单记一下用法就可以了。而且Oracle文档上也没有太具体的描述。看个例子(转载):
对字符串的“sum”——在Oracle中自定义聚集函数的例子
===========================================================
作者: yangtingkun(http://yangtingkun.itpub.net)
发表于: 2004.10.19 17:59
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/3380
---------------------------------------------------------------
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 NUMBER) 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 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 /
类型主体已创建。
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
附:如果关于type的一些基础用法,可以参见此处:http://blog.chinaunix.net/u/20762/showart_329455.html

分享到:
评论

相关推荐

    Oracle自定义聚集函数使用

    关于Oracle自定义聚集函数的使用 。

    Oracle10g自定义聚合函数(字符串拼接)

    * 自定义聚合函数 wmsys.wm_concat 替换办法 * 超大字符串拼接,单个字符串4000、分隔符100... * Oracle11g Release2版本引入了LISTAGG 函数,使得聚集连接字符串变得很容易。并且允许使用我们指定连接串中的字段顺序

    ORACLE 乘积 聚集

    使用自定义聚集函数,实现聚集乘积: 测试select id,fun_multiply(t.value) "乘积" from (select 3 id , 4 value from dual union select 1 id , 1 value from dual union select 1 id , 0 value from dual ...

    聚集函数(自定义分隔符拼接字符串)

    自定义聚集函数拼接字符串,根据网上常见的例子加以改进,可以自定义分隔符(利用的自定义type)。

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例252 自定义最大化、最小化和关闭按钮 321 实例253 禁止改变窗体的大小 323 11.3 设置窗体的标题栏 324 实例254 指定窗体标题栏图标 324 实例255 拖动没有标题栏的窗体 325 实例256 取消窗体标题栏与边框 326 ...

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例260 利用聚集函数COUNT求日销售额大于某值的商品数 9.9 多表查询 实例261 利用FROM子句进行多表查询 实例262 合并多个结果集 9.10 嵌套查询 实例263 简单嵌套查询 实例264 复杂嵌套查询 9.11 子查询 ...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例260 利用聚集函数COUNT求日销售额大于某值的商品数 9.9 多表查询 实例261 利用FROM子句进行多表查询 实例262 合并多个结果集 9.10 嵌套查询 实例263 简单嵌套查询 实例264 复杂嵌套查询 9.11 子查询 ...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数   9.9 多表查询   cc实例261 利用FROM子句进行多表查询   cc实例262 合并多个结果集   9.10 嵌套查询   cc实例263 简单嵌套查询   cc...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数   9.9 多表查询   cc实例261 利用FROM子句进行多表查询   cc实例262 合并多个结果集   9.10 嵌套查询   cc实例263 简单嵌套查询   cc...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    cc实例258 利用聚集函数SUM对销售额进行汇总 cc实例259 利用聚集函数AVG求某班学生的平均年龄 cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数 9.9 多表查询 cc实例261 利用FROM子句进行多表查询 ...

Global site tag (gtag.js) - Google Analytics