在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版本而不同而出现异常,这种变化在11.2.0.3及10.2.0.5中体现出来。原本WM_CONCAT函数返回值为VARCHAR2,但在一些版本下就会变更为CLOB。这一变化导致了很多程序的异常。

Oracle建议用户使用自定义函数来实现该功能,而不是使用WorkSpace的这个内部函数。这个函数包含一个Type、Type Body、Function,可以参考Oracle的实现方式来实现这个函数。

下面分别介绍oracle中wm_concat(column)函数的使用和多行记录合并自定义函数 zh_concat

一、oracle中wm_concat(column)函数的使用

t_student表:

SNAME        SDREE        SAGE        SEX

李坤        天融信        26        男

曹贵生        中银        26        男

柳波        买卖宝        27        男

纪争光        IBM        23        女

李学宇        微软        25        女

李雪琪        文思        25        女

陈绪        中海油        26        男

韩正阳        中海油        24        男

陈伟东        中核        24        男

刘兵        优酷        24        男

丁成云        联想        25        女

王鹏        中兴        25        男

想要的结果为:

--------------------------------

男        李坤,曹贵生,柳波,陈伟东,韩正阳,陈绪,刘兵,王鹏

女        纪争光,李学宇,丁成云,李雪琪

---------------------------------

SQL语句为:

select t.sex,wmsys.wm_concat(t.sname)from t_student tgroup by t.sex

二、自定义函数zh_concat(从网上摘,直接可用)

wm_concat出现在oracle10g版本中,不仅是加密的,而且是在一个单独的用户中,不方便使用。并且10g以前的版本也用不上。经过破解移植,可以方便大家使用

将下边的一个type,一个函数的创建脚本执行,就可以构建自己的wm_concat(这里叫zh_concat)。使用方法同wm_concat:

type:

create or replace TYPE zh_concat_im

AUTHID CURRENT_USER AS OBJECT

(

CURR_STR VARCHAR2(32767),

STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,

P1 IN VARCHAR2) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,

RETURNVALUE OUT VARCHAR2,

FLAGS IN NUMBER)

RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,

SCTX2 IN  zh_concat_im) RETURN NUMBER

);

/

create or replace TYPE BODY zh_concat_im

IS

STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)

RETURN NUMBER

IS

BEGIN

SCTX := zh_concat_im(NULL) ;

RETURN ODCICONST.SUCCESS;

END;

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,

P1 IN VARCHAR2)

RETURN NUMBER

IS

BEGIN

IF(CURR_STR IS NOT NULL) THEN

CURR_STR := CURR_STR || ':' || P1;

ELSE

CURR_STR := P1;

END IF;

RETURN ODCICONST.SUCCESS;

END;

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,

RETURNVALUE OUT VARCHAR2,

FLAGS IN NUMBER)

RETURN NUMBER

IS

BEGIN

RETURNVALUE := CURR_STR ;

RETURN ODCICONST.SUCCESS;

END;

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,

SCTX2 IN zh_concat_im)

RETURN NUMBER

IS

BEGIN

IF(SCTX2.CURR_STR IS NOT NULL) THEN

SELF.CURR_STR := SELF.CURR_STR || ':' || SCTX2.CURR_STR ;

END IF;

RETURN ODCICONST.SUCCESS;

END;

END;

/

函数:

create or replace FUNCTION zh_concat(P1 VARCHAR2)

RETURN VARCHAR2 AGGREGATE USING zh_concat_im ;

Oracle多行记录合并自定义函数的更多相关文章

  1. Oracle多行记录合并的几种方法

    今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nulla ...

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

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.-什么是合并多行字符串(连接字符串)呢,例如: SQL&g ...

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

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.   什么是合并多行字符串(连接字符串)呢,例如:SQL& ...

  4. Oracle多行记录合并处理

    1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...

  5. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  6. oracle ORA_ROWSCN 行记录的更新时间

    在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENC ...

  7. oracle实现自动记录存储过程、自定义函数执行错误

    CREATE OR REPLACE Package Pkg_Stm_Prgerrlog As --Purpose: 实现记录系统错误异常信息,便于问题跟踪 Procedure Sp_Stm_Prger ...

  8. Oracle循环查询结果集 自定义函数

    create or replace function Fun_GetRoleIDList(d_fid char) return varchar is  rolelist varchar(2000);b ...

  9. Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)

    原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...

随机推荐

  1. Codeforces Round #297 (Div. 2)A. Vitaliy and Pie 水题

    Codeforces Round #297 (Div. 2)A. Vitaliy and Pie Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx  ...

  2. hdoj 5119 Happy Matt Friends 背包DP

    Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others ...

  3. hdu 2251 Dungeon Master bfs

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17555   Accepted: 6835 D ...

  4. [Visual Studio] 安装清单

    VS安装位置要求路径必须是英文,且位于Program Files (x86)文件夹下. 下载工具vs_Professional.exe:https://pan.baidu.com/s/1jHRjiia ...

  5. Vanish 详解

    1.varnish 概述:     varnish是一款高性能且开源的方向代理服务器和HTTP加速器,它的开发者poul-Henning kamp FreeBSD 核心的开发人员之一.varnish采 ...

  6. Smali语法简单介绍

    Smali语言其实就是Davlik的寄存器语言: Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示 ...

  7. xamarin其实也是一个鸡肋

    刚刚体验了一把VS 2015,后来因为部分sdk和工具下载太慢,还是最终决定卸载.顺道了解了下xamarin studio.个人感觉Xamarin完全也是一个鸡肋,没必要过多的时间在xamarin上面 ...

  8. OPC Server开发的几大境界

    OPC server的开发相对OPC client 更加困难,OPC server 的开发主要应用COM技术,主要应用书籍为潘爱民写的<COM入门和应用>,大量的技术有很大的可重用性,在开 ...

  9. 线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁

    当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了.本篇体验线程锁的各种用法以及线程死锁.主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.E ...

  10. 【微信小程序】在微信开发工具上七牛云的图片可以看到,但是在真机上看不到的原因解决

    在开发微信小程序过程中,在微信开发者工具上,七牛云的图片都可以展示出来,但是在真机上,七牛云的图片却展示不出来,也没有报404找不到或者不能加载图片的问题, 必须保证: 1.图片是用image加载的: ...