Oracle单个字段多记录拼接方式

 更新时间:2024年07月03日 09:47:24   作者:dongdong咚咚咚  
这篇文章主要介绍了Oracle单个字段多记录拼接方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.sql提供以下两种查询方式

来拼接同一个字段多个记录结果

1.replace+wm_concat
2.listagg within group

两种方式可实现一样的效果。

快速脚本:替换 表名 与 字段名 执行即可验证。

select (
-- 1.replace+wm_concat
select replace(wm_concat(a.name),',','|') from teacher_leader a
) res1,
-- 2.listagg within group
(
select listagg(a.name,'|') within group (order by a.name) from teacher_leader a
) res2
from dual; 

实测:

2.如果报错

ORA-00904: “WM_CONCAT”: 标识符无效

可进行如下处理解决,定义type部分参考这篇文章

注意: 如果你没有system用户,可能是一个用户拥有多个角色,那么上面的参考博客对你不适用。

可用下面的方案:

2.1作为SYSDBA角色登录

2.2 给普通用户授权

GRANT create type to shop;
GRANT create procedure to shop;

登录shop(以普通用户normal的身份登录)

2.3 创建type并创建函数【wm_concat】

--在shop用户作为normal角色会话下创建可用的wm_concat函数,直接执行以下语句
--定义类型
CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT
(
CURR_STR VARCHAR2(32767), 
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
);
/
 
--定义类型body:
CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN
SCTX := WM_CONCAT_IMPL(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
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 WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)
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 wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
/

2.4 最后一步,创建同义词及授权

--创建完成,给其创建同义词及授权,以供其他用户能正常使用。
create public synonym WM_CONCAT_IMPL for shop.WM_CONCAT_IMPL
/
create public synonym wm_concat for shop.wm_concat
/
grant execute on WM_CONCAT_IMPL to public
/
grant execute on wm_concat to public
/

验证

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • win7下oracle 10g安装图文教程

    win7下oracle 10g安装图文教程

    这篇文章主要为大家详细介绍了win7下oracle 10g安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • oracle表的简单操作步骤

    oracle表的简单操作步骤

    这篇文章主要介绍了oracle表的简单操作步骤,需要的朋友可以参考下
    2017-06-06
  • Oracle往某表批量插入记录的几种实现方法

    Oracle往某表批量插入记录的几种实现方法

    这篇文章主要给大家介绍了关于Oracle往某表批量插入记录的几种实现方法,Oracle批量插入语句与其他数据库不同,文中通过代码实例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Oracle 存储过程加密方法

    Oracle 存储过程加密方法

    Oracle 存储过程加密方法,需要的朋友可以参考下。
    2009-10-10
  • Oracle计算时间差为毫秒的实现代码

    Oracle计算时间差为毫秒的实现代码

    这里我是用分隔字符串单独计算毫秒部分,如果有更好的办法,请大家分享一下,下面是查询时间差为毫秒的模板,需要的朋友可以参考下
    2017-03-03
  • 快速解除oracle dataguard的方法

    快速解除oracle dataguard的方法

    文章介绍了如何快速解除Oracle Data Guard配置的过程,包括备份SPFILE到PFILE、调整主库模式、修改主库DG配置参数、删除Standby Log以及重启数据库等步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • Oracle数据库自定义类型type的用法详解

    Oracle数据库自定义类型type的用法详解

    这篇文章主要介绍了Oracle数据库自定义类型type的用法详解,Oracle 数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库,可以看作是 Oracle 就只有一个大数据库,需要的朋友可以参考下
    2023-07-07
  • ORACLE学习笔记-新建用户及建表篇

    ORACLE学习笔记-新建用户及建表篇

    Oracle系统,即是以Oracle关系数据库为数据存储和管理作为构架基础,构建出的数据库管理系统。世界第一个支持SQL语言的商业数据库,定位于高端工作站,以及作为服务器的小型计算机,Oracle公司的整个产品线包括数据库服务器、企业商务应用套件、应用开发和决策支持工具
    2014-08-08
  • 在oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误

    在oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误

    oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误的解决方法
    2009-10-10
  • Oracle存储过程与函数的详细使用教程

    Oracle存储过程与函数的详细使用教程

    存储过程和函数在Oracle中被称为子程序,是指被命名的PL/SQL块,这种块可以带有参数,可以被多次调用,下面这篇文章主要给大家介绍了关于Oracle存储过程与函数的详细使用,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07

最新评论