ORACLE⾃定义合计函数
Author: Rainny
辅导老师
Oracle有提供创建⾃定义合计函数的接⼝。我们通过这个接⼝,可以实现类似于SUM(),MAX(),MIN()等ORACLE built-in合计函数的功能。
创建ORACLE⾃定义合计函数,并须实现ORACLE接⼝中的ODCIAggregateInitialize、ODCIAggregateIterate、ODCIAggregateMerge和ODCIAggregateTerminate这四个函数。请参看: <<Oracle9i Data Cartridge Developer's Guide Relea 2 (9.2)>> Part No. A96595-01第11章:Ur-Defined Aggregate Functions
下⾯的例⼦⽤于实现BITAND的汇总运算。这个函数主要是对于⼀组数据进⾏位的与运算(在ORACLE中是⽤BITAND()函数),最后返回⼀个与运算的总值(类似于SUM(),只不
过SUM函数是对⼀组数据进⾏求和汇总)。
--创建类的说明
CREATE OR REPLACE TYPE Type_sumbitand AS OBJECT
(
element number,
抽将
STATIC FUNCTION ODCIAGGREGATEINITIALIZE
(SCTX IN OUT Type_sumbitand)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE
(SELF IN OUT Type_sumbitand,VALUE IN number)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE
商场购物
(SELF IN Type_sumbitand, RETURNVALUE OUT number, FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE
(SELF IN OUT Type_sumbitand, CTX2 IN Type_sumbitand)RETURN NUMBER
)
秋瑾故居/
--创建类的实现
CREATE OR REPLACE TYPE BODY Type_sumbitand IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE
直笛
(SCTX IN OUT Type_sumbitand)RETURN NUMBER IS
BEGIN
SCTX := Type_sumbitand(null);
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE无形资产的定义
(SELF IN OUT Type_sumbitand,VALUE IN number)RETURN NUMBER IS
BEGIN
IF SELF.element IS NULL THEN
SELF.element :=VALUE;
ELSE
SELF.element := bitand(SELF.element,VALUE);
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE
(SELF IN Type_sumbitand, RETURNVALUE OUT number, FLAGS IN NUMBER)
RETURN NUMBER IS
请假条
白术的功效和作用BEGIN
RETURNVALUE :=SELF.element;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE
(SELF IN OUT Type_sumbitand, CTX2 IN Type_sumbitand)RETURN NUMBER IS
BEGIN
NULL;
RETURN ODCICONST.SUCCESS;
END;
END;
/
--创建函数
CREATE OR REPLACE FUNCTION f_sumbitand
(P_element number)RETURN number
AGGREGATE USING Type_sumbitand;
ORACLE的TYPE和JAVA或C++的类差不多。都有类的声明(相当于C++的头⽂件),类的成员变量,成员函数,具体实现等。所以,PL/SQL在某种程度上也是⾯向对象的⼀种编程语⾔。
下⾯我们来测试⼀下,我们对PERMISSION字段进⾏位的与运算,最后得出⼀个最后的总值:
lect f_sumbitand(t.permission)from acl_assigned_history t where t.permissiontype=3
最后的结果是:7.
我们⽤BITAND()函数验证⼀下,和f_sumbitand计算的结果⼀样。证明函数没有问题。
注意:这个⽤户⾃定义合计函数还没有写异常处理。当碰到⼀个元素是空值的话,有可能会返回NULL.