Oracle
中自定义聚集函数
1.
创建
Types
类型
--
聚合函数就是一个对象
create
or
replace
type
string_type
as
object
(
--
对象变量
total
varchar2
(
4000
),
--
对象初始化
static
function
ODCIAggregateInitialize(sctx
IN
OUT
string_type)
return
number
,
--
聚合函数的迭代方法
member
function
ODCIAggregateIterate(
self
IN
OUT
string_type,
value
IN
varchar2
)
return
number
,
--
当查询语句并行运行时
,
才会使用该方法
,
可将多个并行运行的查询结果聚合
member
function
ODCIAggregateMerge(
self
IN
OUT
string_type,ctx2
IN
string_type)
return
number
,
--
终止聚集函数的处理
,
返回聚集函数处理的结果
member
function
ODCIAggregateTerminate(
self
IN
string_type,returnValue
OUT
varchar2
,flags
IN
number
)
return
number
)
2.
实现
Type
中的函数
create
or
replace
type
body
string_type
is
--
对象初始化
static
function
ODCIAggregateInitialize(sctx
IN
OUT
string_type)
return
number
is
begin
sctx := string_type(
null
);--
有几个变量就有几个参数
--dbms_output.put_line('Initialize--');
return
ODCIConst.Success;--
执行是否成功
end
;
--
聚合函数的迭代方法
member
function
ODCIAggregateIterate(
self
IN
OUT
string_type,
value
IN
varchar2
)
return
number
is
begin
self.total := self.total ||
value
;--
给每行中指定列的值加上标题,并且相连。
--dbms_output.put_line('Iterate--'||self.total);
return
ODCIConst.Success; --
执行是否成功
end
;
--
当查询语句并行运行时
,
才会使用该方法
,
可将多个并行运行的查询结果聚合
member
function
ODCIAggregateMerge(
self
IN
OUT
string_type,ctx2
IN
string_type)
return
number
is
begin
self.total := self.total || ctx2.total;
--dbms_output.put_line('Merge--'||self.total);
return
ODCIConst.Success; --
执行是否成功
end
;
--
终止聚集函数的处理
,
返回聚集函数处理的结果
member
function
ODCIAggregateTerminate(
self
IN
string_type,returnValue
OUT
varchar2
,flags
IN
number
)
return
number
is
begin
returnValue :=
self.total
;--
可进行结果的处理
--dbms_output.put_line('Terminate--'||returnValue);
return
ODCIConst.Success; --
执行是否成功
end
;
end
;
3.
创建函数
CREATE
OR
REPLACE
FUNCTION
strcon(input
varchar2
) --
输入类型
RETURN
varchar2 --
返回类型
PARALLEL_ENABLE
AGGREGATE
USING
ds_tm.string_type;--
引用类型