Oracle多行记录合并自定义函数
来源:互联网 发布:航天一院 知乎 编辑:程序博客网 时间:2024/05/23 15:44
在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 男
赵六 天津 23 女
李雪 深圳 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多行记录合并自定义函数
- oracle 合并多行记录
- mysql,oracle合并单列多行记录
- Oracle 多行记录合并/连接/聚合字符串(合并内容)
- Oracle数据记录合并函数 wm_concat(column)
- oracle自定义聚集函数实现列合并
- oracle 数据库单子段多条记录合并一条记录函数
- Oracle 多行记录合并/连接/聚合字符串
- Oracle多行记录合并成一行展示
- 记录oracle 多行合并成一行(备忘)
- oracle 记录合并
- oracle多行合并
- oracle使用聚合函数实现 多行合并
- oracle多行合并成一行自带函数
- 怎么合并多行记录
- PostgreSql 合并多行记录
- DB2 多行记录合并
- sql合并多行记录
- Pascal 巴斯卡三角形(附代码)
- cocos2d-x源码剖析之场景管理
- android利用pull技术来解析和生成xml文件
- J48 源码学习| Weka
- 从半个砖家说开去--代理服务器
- Oracle多行记录合并自定义函数
- 第一章总结
- Java获取当前时间
- 做一个项目什么最重要(代码部分最多占40%)
- Windows Mobile 开发书籍介绍
- LeetCode - Two Sum
- DOM与JavaScript、jQuery之间的关系
- jQuery-File-Upload图片上传组件简要使用指南(挥泪共享)
- 《Cocos2d-x for iPhone游戏开发实例详解---1.~ 运动条纹》