首页 > 数据库 >oracle函数 wm_concat 与 listagg

oracle函数 wm_concat 与 listagg

时间:2023-06-29 19:13:06浏览次数:35  
标签:listagg seq wm select oracle type id concat

1. wm_concat

select t.type, to_char(wm_concat(t.id||'---'||t.seq)) as id_seq, to_char(wm_concat(t.seq)) as seqs
from (
    select 'A' type, 'A001' id,  1 seq from dual union all 
    select 'A' type, 'A002' id,  2 seq from dual union all 
    select 'B' type, 'B001' id,  1 seq from dual 
) t group by t.type;

查询结果

 

2.listagg

SELECT 
  T.type,
  listagg(T.id ||'---'||T.seq, ',') WITHIN GROUP(ORDER BY T .seq) id_seq,
  listagg(T.seq, ',') WITHIN GROUP(ORDER BY T .seq desc) seqs
FROM (
    select 'A' type, 'A001' id,  1 seq from dual union all 
    select 'A' type, 'A002' id,  2 seq from dual union all 
    select 'B' type, 'B001' id,  1 seq from dual 
) t 
WHERE T.type in ('A', 'B') 
GROUP BY T.type;

查询结果

 

3.wm_concat存在问题
a.该函数不是oracle公开的系统函数,它的用户是wmsys,而不是sys或者system,oracle很有可能在版本升级或者补丁的时候取消或者修改这个函数甚至用户,这种变化oracle是不会公开的。所有可能会由于这个变化而导致异常。
b.大量使用这个函数也会导致临时表空间爆满,这是因为在10.2.0.5中,使用wmsys.wm_concat返回的结果格式是CLOB,CLOB占用的临时表空间只有在连接释放后才会释放,部分通过连接池连接数据库的长连接很有可能导致CLOB占用临时表空间不断累积增大,会导致临时表空间爆满的故障。
c.如果是在程序中大量使用这个函数的话会引起enq:TT的锁,可能会导致某些对象被锁。
d.wm_concat在11g中使用需要用to_char()进行转换,否则会出现不兼容现象

 

4.建议
oracle11g后 推荐使用 listagg 函数,也可以参考wm_concat自己建立一个函数实现相同的行列转换功能

标签:listagg,seq,wm,select,oracle,type,id,concat
From: https://www.cnblogs.com/lgx5/p/17514992.html

相关文章

  • Oracle分批delete大表数据
    分批DELETEDROPTABLET3;CREATETABLET3ASSELECT*FROMDBA_OBJECTS;DECLARECURSORMYCURSORISSELECTROWIDFROMT3ORDERBYROWID;--按ROWID排序的CURSOR,删除条件是XXX=XXXX,根据实际情况修改TYPEROWID_TABLE_TYPEISTABLEOFROWIDINDEXBYPLS_INT......
  • oracle注入
    基础知识Oracle是一款使用较为广泛的关系型数据库,在SQL注入中他与mysql语法最大的区别就是,使用select查询时需要指定表名才能进行查询。很多时候我们在进行注入时,刚开始是不知道其表名的,所以我们得想一个办法来解决这个问题:就是使用oracle中的dual虚拟表,他是默认存在的,他里面永远......
  • PSExec 与 WMI
    郑重声明:本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。PSExec与WMI1PSExec1.1Windows下PSExec使用PSExec原理:通过管道在......
  • oracle 11g开机自启动
    oracle11g开机自启动vi/etc/oratabPROD:/u01/app/oracle/product/11.2.0/dbhome_1:Yvi/etc/rc.d/rc.localsu-oracle-lc"/u01/app/oracle/product/11.2.0/db_1/bin/dbstart"su-oracle-lc"/u01/app/oracle/product/11.2.0/db_1/bin/lsnrctlstatusli......
  • 根据进程号查看oracle会话信息
    colsidformat9999colspidformat9999999999colserial#format9999999collogon_timeformata20colmachineformata30colterminalformata20setlinesize100selectp.spid,s.sid,p.pid,s.programfromv$processp,v$sessionswherep.addr=s.addrandp.......
  • Oracle 基于标签的安全性
    Oracle基于标签的安全性(OLS)是Oracle数据库的一项功能,可根据安全标签对敏感数据提供细粒度的访问控制。此功能使组织能够根据数据的敏感性而不是传统的用户角色和权限方法来实施访问控制策略。本文将讨论Oracle基于标签的安全性的工作原理及其优势。Oracle基于标签的安全......
  • 查看Oracle自增列
    Oracle添加自增列CreateSequenceSEQ_XXX最后一个是自增列的名称,一般是  SEQ_表名。为表添加一个自增的列并将上面创建的序列值给这个列ALTERTABLEemployeeADDemp_idNUMBER(10)DEFAULTSEQ_XXX.nextvalNOTNULL;这里nextval是关键词,表示下一个值 可以在Pl......
  • Oracle DataGuard 监控日志同步是否正常
    1.查看备库(或者主库)的状态SETfeedoffSETlines300SETpages999COLUMNdatabase_nameheading"Database|Name"FORMATa12COLUMNdatabase_roleheading"Database|Role"FORMATa30COLUMNprotection_modeheading"Prote......
  • Oracle数据库用户密码过期的解决方法
    问题现象:今天在更改数据库数据的时候,程序报错了,如下:ORA-28001:thepasswordhasexpired问题分析:很显然,报错原因就是:密码已过期!所以现在需要做的事情只有两件:1.修改密码的过期时间2.修改/重置密码这里分析一下为什么要这样做:1.修改密码的过期时间:这是因为OracleDatab......
  • pmm1安装部署oracledb_exporter
    ########################被监控的oracle服务器上安装##################1.下载下载地址https://github.com/iamseth/oracledb_exporter#installationoracledb_exporter.tar.gz二进制文件包该文件里只有一个可执行文件oracledb_exporter-0.5.0.tar.gz源码包,我们需要解压该包......