服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

用一个实例讲解oracle的自定义聚集函数

【赛迪网-it技术报道】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

扫描关注微信公众号