楼主: newkid

[精华] 半原创之:聚合求积函数!顺便解决BOM的问题

[复制链接]
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-11-29 06:00:13
11#
发表于 2008-7-14 09:47 | 只看该作者
CONNECT_BY_ISLEAF 这个是10才有的特性。

原帖由 zhangweicai74 于 2008-7-14 08:39 发表

咱9I的用不了这个函数:CONNECT_BY_ISLEAF

使用道具 举报

回复
论坛徽章:
21
红旗
日期:2013-09-30 15:26:01凯迪拉克
日期:2013-10-23 12:48:26比亚迪
日期:2013-11-01 09:19:01奔驰
日期:2013-12-13 09:27:30马上有对象
日期:2014-11-18 10:46:242015年新春福章
日期:2015-04-28 15:24:55慢羊羊
日期:2015-05-28 09:49:31
12#
发表于 2008-7-14 11:25 | 只看该作者
有谁 知道11 的sql有什么新特性?

使用道具 举报

回复
论坛徽章:
12
2013年新春福章
日期:2013-02-25 14:51:24
13#
发表于 2009-8-17 23:53 | 只看该作者
第一种方法比较简单先记下了

使用道具 举报

回复
论坛徽章:
5
2014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:112015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31秀才
日期:2016-03-24 09:10:24
14#
发表于 2009-8-18 10:05 | 只看该作者
顺便问一下
有没有聚合and、or、xor函数

使用道具 举报

回复
论坛徽章:
3
祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2009-8-18 20:32 | 只看该作者
原帖由 lypch 于 2008-7-13 21:23 发表
都是高手啊,不知道什么时候才可以到你们的水平。


看着发晕

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
16#
 楼主| 发表于 2009-8-19 01:14 | 只看该作者
聚合位操作可以类似实现。但有什么实际作用呢?

聚合AND操作:
create or replace type and_agg_type as object
(
   total NUMBER,

   static function
        ODCIAggregateInitialize(sctx IN OUT and_agg_type )
        return number,

   member function
        ODCIAggregateIterate(self IN OUT and_agg_type ,
                             value IN NUMBER )
        return number,

   member function
        ODCIAggregateTerminate(self IN and_agg_type,
                               returnValue OUT  NUMBER,
                               flags IN number)
        return number,

   member function
        ODCIAggregateMerge(self IN OUT and_agg_type,
                           ctx2 IN and_agg_type)
        return number
);
/

create or replace type body and_agg_type
is

static function ODCIAggregateInitialize(sctx IN OUT and_agg_type)
return number
is
begin
    sctx := and_agg_type( null );
    sctx.total :=1;
    return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT and_agg_type,
                                     value IN NUMBER )
return number
is
begin
    self.total := BITAND(self.total, value);
    return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN and_agg_type,
                                       returnValue OUT NUMBER,
                                       flags IN number)
return number
is
begin
    returnValue := self.total;
    return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT and_agg_type,
                                   ctx2 IN and_agg_type)
return number
is
begin
    self.total := BITAND(self.total, ctx2.total);
    return ODCIConst.Success;
end;


end;
/

CREATE or replace
FUNCTION and_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING and_agg_type;
/


聚合OR操作:
create or replace type or_agg_type as object
(
   total NUMBER,

   static function
        ODCIAggregateInitialize(sctx IN OUT or_agg_type )
        return number,

   member function
        ODCIAggregateIterate(self IN OUT or_agg_type ,
                             value IN NUMBER )
        return number,

   member function
        ODCIAggregateTerminate(self IN or_agg_type,
                               returnValue OUT  NUMBER,
                               flags IN number)
        return number,

   member function
        ODCIAggregateMerge(self IN OUT or_agg_type,
                           ctx2 IN or_agg_type)
        return number
);
/

create or replace type body or_agg_type
is

static function ODCIAggregateInitialize(sctx IN OUT or_agg_type)
return number
is
begin
    sctx := or_agg_type( null );
    sctx.total :=0;
    return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT or_agg_type,
                                     value IN NUMBER )
return number
is
begin
    self.total := self.total + value - BITAND(self.total, value);
    return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN or_agg_type,
                                       returnValue OUT NUMBER,
                                       flags IN number)
return number
is
begin
    returnValue := self.total;
    return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT or_agg_type,
                                   ctx2 IN or_agg_type)
return number
is
begin
    self.total := self.total + ctx2.total - BITAND(self.total, ctx2.total);
    return ODCIConst.Success;
end;


end;
/

CREATE or replace
FUNCTION or_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING or_agg_type;
/


聚合XOR操作:
create or replace type xor_agg_type as object
(
   total NUMBER,

   static function
        ODCIAggregateInitialize(sctx IN OUT xor_agg_type )
        return number,

   member function
        ODCIAggregateIterate(self IN OUT xor_agg_type ,
                             value IN NUMBER )
        return number,

   member function
        ODCIAggregateTerminate(self IN xor_agg_type,
                               returnValue OUT  NUMBER,
                               flags IN number)
        return number,

   member function
        ODCIAggregateMerge(self IN OUT xor_agg_type,
                           ctx2 IN xor_agg_type)
        return number
);
/

create or replace type body xor_agg_type
is

static function ODCIAggregateInitialize(sctx IN OUT xor_agg_type)
return number
is
begin
    sctx := xor_agg_type( null );
    sctx.total :=0;
    return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT xor_agg_type,
                                     value IN NUMBER )
return number
is
begin
    self.total := self.total + value - BITAND(self.total, value)*2;
    return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN xor_agg_type,
                                       returnValue OUT NUMBER,
                                       flags IN number)
return number
is
begin
    returnValue := self.total;
    return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT xor_agg_type,
                                   ctx2 IN xor_agg_type)
return number
is
begin
    self.total := self.total + ctx2.total - BITAND(self.total, ctx2.total)*2;
    return ODCIConst.Success;
end;


end;
/

CREATE or replace
FUNCTION xor_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING xor_agg_type;
/

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
17#
发表于 2009-8-19 16:17 | 只看该作者
还是写自定义聚合函数来得容易.

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
18#
发表于 2009-8-19 20:46 | 只看该作者
重要的是oracle支持这种自定义,为开发者留了一个途径

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
19#
发表于 2010-4-19 09:05 | 只看该作者
我觉得oracle应该提供这个自定义聚合的文档,不知道在哪一本

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
20#
 楼主| 发表于 2010-4-20 00:15 | 只看该作者
原帖由 〇〇 于 2010-4-19 09:05 发表
我觉得oracle应该提供这个自定义聚合的文档,不知道在哪一本


文档:Oracle® Data Cartridge Developer's Guide

http://stanford.edu/dept/itss/do ... 10800/dciaggref.htm

这么老的帖子竟然被挖掘出来,我也不觉得这个方法有什么稀奇,不过还是谢谢老狐狸!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表