conn wmsys/123456 --在wmsys下创建可用的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_...
最近项目Oracle数据库升级由11g升到19C,在验证过程中发现wm_concat函数竟然失效了。 经过网上查询资料发现,wm_concat函数是oracle的非公开函数,在新版的oracle中不支持该函数。 1.2 解决方案 因该函数在代码中使用次数过多,在不改动代码前提下,选择重新创建该函数。建议后续在开发过程中不建议再使用该函数。 1.3 实施...
1createorreplacefunctionwm_concat(valueVarchar2)returnVarchar22parallel_enable aggregate using string_sum_obj; 最后去执行WM_CONCAT()函数会发现,他的效果和以前一样一样!
select testid,wm_concat(test) as test,wm_concat(testdlj) as testdlj from test t group by testid * ERROR at line 1: ORA-00904: "WM_CONCAT": invalid identifier 小结:如上所示,在19c中使用wm_concat函数,出现报错ora-00904.该函数在oracle 19c中不再支持. 当数据库从11g升到19c后,若该函数...
本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好。这个函数在Oracle12是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用。最近遇到这个问题,网上博客很多都写到了自定义列转行函数的办法...
尝试通过去重后聚合解决,使用WM_CONCAT(distinct XX)。然而,distinct选项在函数中被禁止。单独查询中此用法可行。编译未能通过。调整思路,去重操作移至子查询中。修改为从(select distinct XX)查询,外层聚合。进一步思考,聚合函数listagg是否能提供去重功能?答案是否定的。listagg虽能指定聚合时的分隔符...
今天测试过程,报了个字段超长的错。原因是聚合函数wm concat中值太多,超出能to_char的长度。为了解决这个问题尝试将值先去重,再聚合,即WM_CONCAT(distinct XX) ,然后报了个错:distinct选项在此函数中禁用。而…
首先分析一下,Oracle11不兼容vm_concat列转行函数,并不代表其它函数不兼容,或许可以找到其它代替的,通过找资料,发现了Oracle11提供的另外一个函数:listagg()函数 语法:listagg(参数,‘分隔符’) within group(order by 参数id) 列子:to_char(listagg(ur.user_role,',' ) within GROUP (order by (ur.user_...
解决办法有两种,一种是采用Oracle本身的脚本来创建WM_CONCAT函数,一种是采用自己创建的函数来解决这个问题。 1、用Oracle自带脚本重建WMSYS用户的WMSYS.WM_CONCAT函数 运行如下脚本卸载WMSYS用户的数据: 代码语言:javascript 复制 @$ORACLE_HOME/rdbms/admin/owmuinst.plb ...
oracle12c中wm_concat函数问题解决 一.解锁wmsys用户,sys用户登录7.0.143.149:1521/pdbups alteruser wmsys accountunlock;二.创建包、包体和函数 以wmsys用户登录数据库7.0.143.149:1521/pdbups,执行下面的命令 CREATEORREPLACE NONEDITIONABLE TYPE WM_CONCAT_IMPL ASOBJECT -- AUTHID CURRENT_USER AS OBJECT ...