一个Oracle自定义聚集函数的例子
前天有人提了需求,想对某个字段进行按位的或操作。本来建议查询出来之后在应用程序里面处理,但是数据量比较大,觉得还是返回一个分组计算之后的值比较合适。
两个问题,一个是按为或的操作,这个参考了别人的文档,用bitand函数实现。 原文如下:
http://blog.chinahr.com/blog/hewy0526/post/112968
然后就是自定义的聚集函数了。这个参考了官方文档的例子,就不列出原文出处了。
全部代码如下:
-- 1. Implement the type BitOrImpl to contain the ODCIAggregate routines:
create type BitOrImpl as object
(
bitorval NUMBER, -- result.
static function ODCIAggregateInitialize(sctx IN OUT BitOrImpl)
return number,
member function ODCIAggregateIterate(self IN OUT BitOrImpl,
value IN number) return number,
member function ODCIAggregateTerminate(self IN BitOrImpl,
returnValue OUT number, flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT BitOrImpl,
ctx2 IN BitOrImpl) return number
);
/
-- 2. mplement the type body for BitOrImpl:
create or replace type body BitOrImpl is
static function ODCIAggregateInitialize(sctx IN OUT BitOrImpl)
return number is
begin
sctx := BitOrImpl(0);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT BitOrImpl, value IN number) return number is
begin
self.bitorval := (self.bitorval + value) - bitand(self.bitorval, value);
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN BitOrImpl,
returnValue OUT number, flags IN number) return number is
begin
returnValue := self.bitorval;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT BitOrImpl, ctx2 IN BitOrImpl) return number is
begin
self.bitorval := (self.bitorval + ctx2.bitorval) - bitand(self.bitorval, ctx2.bitorval);
return ODCIConst.Success;
end;
end;
/
-- 3. Create the user-defi
相关文档:
ORACLE服务器一般包括以下三种安装方式
基于主机方式:在此配置下,用户可直接在安装了数据库的计算机上登录ORACLE数据库。
客户端-服务器(client-server)(两层模型)方式:数据库和客户终端分别安装在不同的计算机上,用户可通过网络从个人计算机(客户端)上访问数据库。
客户端-应用服务器-服务器(client-applicatio ......
因开发要求,需要对oracle里的数据与数据文件作比较。如采用客户端连接oracle的方式则显得小题大做,且工作量大,不易维护。直接采用存储过程,调用UTL_FILE包的公共过程,显得方便得多。
首先,需要把数据文件所在的目录注册到oracle中,用create directory。。。语句,然后把此目 ......
sql server
替换null:isnull(arg,value)
如:select isnull(price,0.0) from orders ,如果price为null的话,用0 ......
oracle 可有什么方法 统计每月累积购买人数
比如说有个门店 2008年购买商品的人数
表:t_buy_log 字段 f_username 用户名称;购买时间f_buytime
1 如果是统计每月购买人数
select to_char(f_buytime,'yyymm'),count(distinct f_username)
from t_buy_log
group by to_char(f_buytime,'yyymm')
......