`

在oracle里自定义一个字符串的聚集函数

 
阅读更多

一、定义type、 type body、function

create or replace type strcat_type as object (
    cat_string varchar2(4000),
    static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number,
    member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return

number,
    member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)

return number,
    member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out

varchar2,flags in number) return number
)

 

create or replace type body strcat_type is
  static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
  is
  begin
      cs_ctx := strcat_type( null );
      return ODCIConst.Success;
  end;

  member function ODCIAggregateIterate(self IN OUT strcat_type,
                                       value IN varchar2 )
  return number
  is
  begin
      --1. concat string
      self.cat_string := self.cat_string || ','|| value;
      -- 2.get union set
      -- if  instr(self.cat_string, value ) = 0 or self.cat_string is null then
      --        self.cat_string := self.cat_string || ',' || value ;
      -- else
      --        self.cat_string := self.cat_string ||'' ;
      -- end if ;
      return ODCIConst.Success;
  end;

  member function ODCIAggregateTerminate(self IN Out strcat_type,
                                         returnValue OUT varchar2,
                                         flags IN number)
  return number
  is
  begin
      returnValue := ltrim(rtrim(self.cat_string,','),',');
      return ODCIConst.Success;
  end;

  member function ODCIAggregateMerge(self IN OUT strcat_type,
                                     ctx2 IN Out strcat_type)
  return number
  is
  begin
      self.cat_string := self.cat_string || ',' || ctx2.cat_string;
      return ODCIConst.Success;
  end;

end;

 

CREATE OR REPLACE FUNCTION strcat(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING strcat_type;

 

二、使用该聚集函数

 

    数据库中已经存在一张表A,如下所示:

SQL> desc a;
Name Type     Nullable Default Comments 
------- ------------- -------- ------- -------- 
COUNTRY VARCHAR2(100) Y                       
CITY VARCHAR2(100) Y                  
 
SQL> select * from a;
 
COUNTRY                                                             CITY
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
中国                                                                      台北
中国                                                                      香港
中国                                                                      上海
日本                                                                      东京
日本                                                                      大阪

 

    下面来使用步骤一中创建的strcat函数:

SQL> SELECT t.country,strcat(t.city) FROM A t GROUP BY t.country; 
 
COUNTRY                                                             STRCAT(T.CITY)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
日本                                                                      东京,大阪
中国                                                                      台北,香港,上海
 

 

分享到:
评论

相关推荐

    Oracle10g自定义聚合函数(字符串拼接)

    * 自定义聚合函数 wmsys.wm_concat 替换办法 * 超大字符串拼接,单个字符串4000、分隔符100... * Oracle11g Release2版本引入了LISTAGG 函数,使得聚集连接字符串变得很容易。并且允许使用我们指定连接串中的字段顺序

    聚集函数(自定义分隔符拼接字符串)

    在Oracle数据库中,有时我们需要将多个字符串连接成一个单一的字符串,这在处理报告或聚合数据时非常常见。Oracle提供了一些内置的聚集函数,如`LISTAGG`,但它们可能无法满足所有需求,比如在特定场景下需要自定义...

    oracle与Sql区别

    - SQL Server以8K的页为最小分配单位,8个页组成一个扩展,数据以表的形式存储在数据库中,分配相对固定,不支持分区。 3. **表空间管理** - Oracle的表空间分为多种,如SYSTEM、RBS、TEMP、USERS等,数据字典和...

    SQL最佳实践

    - **自定义聚集函数**:允许用户定义自己的聚集函数以适应特殊需求。 ##### 字符分组聚合 字符分组聚合是指将多个字符串值合并成一个字符串的过程。在Oracle中,可以使用多种方法来实现这一目标,包括`WMSYS.WM_...

    sqlserver和oracle数据迁移方案

    在SQL Server中,一个表只能有一个聚集索引。 - **非聚集索引**:非聚集索引不按索引顺序存储数据,而是包含指向实际数据行的指针。 - **索引的语法和命名**:创建索引时需要遵循一定的命名规范,并且索引的创建语法...

    GBase 8A MPP Cluster 产品培训-SQL指南

    GBase 8A MPP Cluster提供了丰富的内置函数,包括日期和时间函数(如ADDDATE和CURTIME)、字符串函数(如CONCAT和SUBSTRING)、数值函数(如RAND和ROUND)、位函数、加密函数、信息函数、辅助函数、聚集函数、OLAP...

    SQL 高手必备手册

    2. **字符串函数**:如LEN、CONCAT、LEFT、RIGHT、SUBSTRING等,它们用于处理文本数据,例如获取字符串长度、拼接字符串、提取子串等。 3. **日期/时间函数**:如GETDATE、DATEADD、DATEDIFF等,它们用于处理日期和...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛...

    数据分析核心知识点总结 —— SQL.pdf

    - 反向键索引(Oracle):适用于字符串排序。 - 函数索引:基于函数结果创建索引。 - 索引组织表(Oracle):将数据和索引存储在同一个结构中。 **五、约束** 约束用于保证数据的完整性和一致性。 1. **创建、...

    Pentaho多维分析(Mondrian)使用指南

    9. **函数**:MDX提供了丰富的内置函数,涵盖了成员、集合、统计、逻辑、字符串等多个领域,极大增强了查询的灵活性和表现力。 #### 四、数据模式与优化 1. **模式文件**:Mondrian通过模式文件来定义数据源、立方...

Global site tag (gtag.js) - Google Analytics