傅老师课堂:Oracle高级应用之去重聚合函数

开篇一笑:高中的时候,自行车被偷,早上顺路搭同学的自行车。我坐在后座看到前面一大妈跑步,很猥琐的对同学说:“你看前面那个肥婆跑得屁股都甩圆了!”这货沉默了一下。当我们和大妈擦身而过的时候,他喊道:“妈....”

本例实现的是连接字符串,并且去掉重复的项。

聚合函数实际上就是一个对象:

create or replace type distinct_concat_type as object
(
--对象变量
  cat_string varchar2(500),
--对象初始化
  static function ODCIAggregateInitialize(cs_ctx In Out distinct_concat_type)
    return number,
--聚合函数的迭代方法
  member function ODCIAggregateIterate(self  In Out distinct_concat_type,
                                       value in varchar2) return number,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
  member function ODCIAggregateMerge(self In Out distinct_concat_type,
                                     ctx2 In Out distinct_concat_type)
    return number,
--终止聚集函数的处理,返回聚集函数处理的结果
  member function ODCIAggregateTerminate(self        In Out distinct_concat_type,
                                         returnValue Out varchar2,
                                         flags       in number)
    return number
)

接着实现对象主体:

create or replace type body distinct_concat_type is
  --对象初始化
  static function ODCIAggregateInitialize(cs_ctx IN OUT distinct_concat_type)
    return number is
  begin
    cs_ctx := distinct_concat_type(null);
    return ODCIConst.Success;
  end;

  --聚合函数的迭代方法
  member function ODCIAggregateIterate(self  IN OUT distinct_concat_type,
                                       value IN varchar2) return number is
  begin
    if self.cat_string is null or (instr(self.cat_string, value, 1, 1) = 0) then
      self.cat_string := self.cat_string || ',' || value;
    end if;
    return ODCIConst.Success;
  end;

  --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
  member function ODCIAggregateMerge(self IN OUT distinct_concat_type,
                                     ctx2 IN Out distinct_concat_type)
    return number is
  begin
    if self.cat_string is null or
       (instr(self.cat_string, ctx2.cat_string, 1, 1) = 0) then
      self.cat_string := self.cat_string || ',' || ctx2.cat_string;
    end if;
    return ODCIConst.Success;
  end;

  --终止聚集函数的处理,返回聚集函数处理的结果
  member function ODCIAggregateTerminate(self        IN Out distinct_concat_type,
                                         returnValue OUT varchar2,
                                         flags       IN number) return number is
  begin
    returnValue := ltrim(rtrim(self.cat_string, ','), ',');
    return ODCIConst.Success;
  end;
end;


最后定义函数,使用的是上面定义的对象:

create or replace function distinct_concat(input varchar2) return varchar2
  parallel_enable
  aggregate using distinct_concat_type;




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值