`

Oracle自定义聚合函数实现字符串拼接

阅读更多
--定义函数
CREATE OR REPLACE FUNCTION f_catstring (p_str VARCHAR2)
   RETURN VARCHAR2
   AGGREGATE USING t_stringconcat;
--定义类型
CREATE OR REPLACE TYPE t_stringconcat AS OBJECT (
   str      VARCHAR2 (1000),
   oldstr   VARCHAR2 (1000),
   STATIC FUNCTION odciaggregateinitialize (sctx IN OUT t_stringconcat)
      RETURN NUMBER,
   MEMBER FUNCTION odciaggregateiterate (
      SELF    IN OUT   t_stringconcat,
      VALUE   IN       VARCHAR2
   )
      RETURN NUMBER,
   MEMBER FUNCTION odciaggregateterminate (
      SELF          IN       t_stringconcat,
      returnvalue   OUT      VARCHAR2,
      flags         IN       NUMBER
   )
      RETURN NUMBER,
   MEMBER FUNCTION odciaggregatemerge (
      SELF   IN OUT   t_stringconcat,
      ctx2   IN       t_stringconcat
   )
      RETURN NUMBER
);
--定义body
CREATE OR REPLACE TYPE BODY t_stringconcat
IS
   STATIC FUNCTION odciaggregateinitialize (sctx IN OUT t_stringconcat)
      RETURN NUMBER
   IS
   BEGIN
      --初始化
      sctx := t_stringconcat(NULL, NULL);
      RETURN odciconst.success;
   END;
   MEMBER FUNCTION odciaggregateiterate (
      SELF    IN OUT   t_stringconcat,
      VALUE   IN       VARCHAR2
   )
      RETURN NUMBER
   IS
   BEGIN
      --解决拼接多个字段重复的问题
      IF NOT SELF.oldstr IS NULL AND SELF.oldstr = VALUE
      THEN
         NULL;
      ELSE
         SELF.str := SELF.str || VALUE || ', ';
      END IF;

      SELF.oldstr := VALUE;
      RETURN odciconst.success;
   END;
   MEMBER FUNCTION odciaggregateterminate (
      SELF          IN       t_stringconcat,
      returnvalue   OUT      VARCHAR2,
      flags         IN       NUMBER
   )
      RETURN NUMBER
   IS
   BEGIN
      returnvalue := SUBSTR (SELF.str, 1, LENGTH (SELF.str) - 2);
      RETURN odciconst.success;
   END;
   MEMBER FUNCTION odciaggregatemerge (
      SELF   IN OUT   t_stringconcat,
      ctx2   IN       t_stringconcat
   )
      RETURN NUMBER
   IS
   BEGIN
      NULL;
      RETURN odciconst.success;
   END;
END;
以前程序在oracle 9i上测试通过.
分享到:
评论
2 楼 zq_zero 2011-08-31  
   很好,不过如果改为用字符串数组来存储迭代结果和判断是否重复的话就更准确了,避免隔代重复
1 楼 sea0108 2010-10-26  
good。。

相关推荐

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

    * 自定义聚合函数 wmsys.wm_concat 替换办法 * 超大字符串拼接,单个字符串4000、分隔符100,可拼出超4000的超长字符串 * 可自定义指定分隔符separator * 可自定义指定排序字段sequence,对于数字或日期类型的...

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

    本文将深入探讨如何在PL/SQL中创建自定义聚集函数,以实现自定义分隔符的字符串拼接。 首先,让我们理解聚集函数的概念。聚集函数在SQL查询中用于处理一组值,而不是单个值。它们对一组行进行操作并返回单个结果。...

    Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

    `LISTAGG()`是Oracle 11g引入的一个聚合函数,用于将多行数据合并为一个字符串,特别适合于分组查询。它允许指定分隔符: ```sql SELECT column1, LISTAGG(column2, ', ') WITHIN GROUP (ORDER BY column2) FROM...

    Oracle 多行记录合并_连接_聚合字符串的几种方法_oracle_脚本之家1

    Oracle数据库在处理多行记录合并、连接和聚合字符串时,有多种方法,下面将详细介绍其中的几种常见技术。 1. 被集合字段范围小且固定型 这种方法适用于字段值有限且已知的情况。通过使用`DECODE`函数,我们可以为每...

    Oracle多行记录合并

    - **`LISTAGG()` 函数:** 这是Oracle 11g及以后版本引入的一个强大的聚合函数,专门用于将多行数据合并为单行字符串。它接受一个排序表达式和一个分隔符,返回所有行的合并结果。例如,假设我们有一个名为`orders`...

    解决Oracle没有WM_CONCAT函数.zip

    2. 自定义聚合函数:如果你不能升级到11g或以上,或者需要兼容更早的版本,可以创建自己的PL/SQL聚合函数来模拟WM_CONCAT的行为。这正是压缩包中的PL/SQL源代码可能做的事情。 3. 使用XMLAGG函数:虽然不是为字符串...

    Oracle 多行记录合并/连接/聚合字符串的几种方法

    在Oracle中,虽然没有内置的聚合函数直接支持这种操作,但可以通过一些技巧和自定义方法来实现。下面我们将对几种常用的方法进行详细介绍。 1. **被集合字段范围小且固定型** 这种方法适用于已知待合并字段值的...

    Oracle实用函数大全

    `to_char`函数将日期或数字转换为字符串,支持自定义格式化: ```sql SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS DAY') FROM DUAL; ``` #### 2. 数字格式化 当处理货币、百分比等数据时,`to_char`配合适当的...

    oracle 和sql Server 函数对比

    24. **字符串拼接** - SQL Server使用`CONCAT`函数,Oracle使用`||`操作符。 - 示例:SQL Server中`SELECT CONCAT('11', '22', '33')`;Oracle中`SELECT '11' || '22' || '33' FROM DUAL`。 25. **子字符串定位**...

    Oracle函数之LISTAGG

    Oracle数据库中的LISTAGG函数是一个非常实用的聚合函数,它允许你在一组数据中对特定列的值进行排序和拼接,生成一个字符串结果。这个函数特别适用于需要将多个行的数据合并到一行的情况,例如,当你想要在一个报告...

    oracle ocp认证考试 新047(051)课堂笔记 甲骨文

    字符函数中,LOWER将字符串转换为小写,UPPER转换为大写,INITCAP首字母大写,CONCAT用于字符串拼接,SUBSTR用于提取字符串的一部分,INSTR查找字符在字符串中的位置,LPAD和RPAD分别用于左侧和右侧填充字符。...

    oracle PL/SQL测试题目和详细答案

    - **知识点解析:** 通过创建自定义函数,结合表的遍历和字符串拼接实现复杂数据处理。 - **T_ARRAY**:自定义类型用于存储数据。 - **BULK COLLECT**:收集查询结果。 - **FOR循环**:用于遍历数据并拼接字符串。...

    oracle实现多行合并的方法

    `LISTAGG`函数不仅可以处理字符串类型的数据,还可以处理数值类型,并且可以自定义分隔符。例如,使用`LISTAGG`来实现相同的功能: ```sql SELECT t.rank, LISTAGG(t.Name, ', ') WITHIN GROUP (ORDER BY t.Name) ...

    Oracle学习笔记

    ` 连接两个字符串,将emname与'aa'拼接在一起。 8. **特殊字符处理**:两个单引号 `'wo'||'a''a'` 表示一个单引号,返回结果是 'woa'a'。 9. **去除重复值**:`select distinct a from dual;` 可以用于去除查询...

    Oracle图文笔记

    7. **字符串拼接:** 使用 `||` 运算符拼接字符串。 - 示例: `SELECT 列名1 || ' ' || 列名2 FROM 表名;` —— 将两个列名拼接成一个字符串。 8. **去重:** 使用 `DISTINCT` 关键字去除重复记录。 - 示例: `SELECT...

    经典SQL语句收集(ORACLE)

    函数内部通过循环生成随机数,并将这些随机数拼接成一个字符串返回。通过调用`DBMS_RANDOM.VALUE`函数来实现随机数生成。 #### 三、经典与业务相关的存储过程 存储过程是PL/SQL中的一种对象,可以封装一组SQL命令...

    SQL 高手必备手册

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

    IBM的sql开发规范

    - **禁止带参数的字符串拼接**:这样做是为了防止SQL注入攻击,参数化查询更安全且易于优化。 - **允许不带参数的语句拼接**:例如在构建动态WHERE条件时,但需谨慎处理以避免SQL注入。 2. **编码要求**: - **...

    jdk1.8无政策限制文件

    - **字符串重复优化**:对于连续的字符串拼接,JVM会自动合并,提高了效率。 了解并掌握JDK 1.8的这些特性,有助于开发者编写出高效、可维护的Java程序。在使用无政策限制文件时,务必谨慎,并确保只在开发和测试...

    SqlBuilder:适用于.Net项目的严格类型化SqlBuilder

    在传统的字符串拼接SQL语句时,可能会遇到SQL注入的风险,而SqlBuilder通过强类型化避免了此类问题,提高了代码的安全性。此外,它还能够帮助开发者减少因手动构造SQL字符串而导致的错误,提升开发效率。 Sql...

Global site tag (gtag.js) - Google Analytics