Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Oracle|19C升级WM_CONCAT函数失效

Oracle|19C升级WM_CONCAT函数失效

作者头像
Java小技巧
发布于 2022-05-23 04:35:52
发布于 2022-05-23 04:35:52
3.6K00
代码可运行
举报
文章被收录于专栏:Java小技巧Java小技巧
运行总次数:0
代码可运行

1.1 问题背景

最近项目Oracle数据库升级由11g升到19C,在验证过程中发现wm_concat函数竟然失效了。

经过网上查询资料发现,wm_concat函数是oracle的非公开函数,在新版的oracle中不支持该函数。

1.2 解决方案

因该函数在代码中使用次数过多,在不改动代码前提下,选择重新创建该函数。建议后续在开发过程中不建议再使用该函数。

1.3 实施步骤

--首先使用dba账号登录oracle数据库(使用oracle / root用户执行)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlplus / as sysdba

--解锁wmsys用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter user wmsys account unlock;

--并为wmsys用户授权,可根据需要授权,不建议授权所有权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grant all privileges to wmsys;

--如果不知道wmsys用户的密码,可以修改其密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter user wmsys identified by Pro_ut#19;

--使用wmsys用户登录数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conn wmsys/Pro_ut#19

--在wmsys下创建可用的wm_concat函数,直接执行以下语句

--定义类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
/

--自定义行变列函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
/

--创建完成,给其创建同义词及授权,以供其他用户能正常使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL
/
create public synonym wm_concat for wmsys.wm_concat
/
grant execute on WM_CONCAT_IMPL to public
/
grant execute on wm_concat to public
/

1.4 方案验证

wm_concat函数可正常使用

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【DB笔试面试459】ORA-00904: "wm_concat":invalid identifier错误如何解决?
ORA-00904: "wm_concat":invalid identifier错误如何解决?
AiDBA宝典
2019/09/29
2.4K0
【DB笔试面试459】ORA-00904: "wm_concat":invalid identifier错误如何解决?
Oracle 聚合函数解决聚集连接字符串问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53906139
用户1148526
2019/05/25
2K0
oracle字符串自身去重,oracle拼接字符串函数(去重和不去重)「建议收藏」
CREATE OR REPLACE FUNCTION f_link (p_str VARCHAR2)
全栈程序员站长
2022/11/08
2.1K0
oracle wm_concat 拼接乱码
针对oracle拼接函数的乱码,首先查询一下oracle字符的编码是否支持中文,查询语句: SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = ‘NLS_CHARACTERSET’; 如果是中文的,则选择另一种方式: wmsys.wm_concat(to_char(….))..应该加上to_char() 在拼接的字段加上转换。
用户5640963
2019/07/28
1.9K0
ORA-00932: inconsistent datatypes: expected - got CLOB
      最近数据库从10.2.0.3升级到了10.2.0.5之后,一些对象无法编译通过。查看了这些对象主要表现在之前写法不严格的SQL语法导致了这些package无法成功编译,诸如select查询列中不能使用混淆的列名称等。另外一个比较表现突出的是返回ORA-00932: inconsistent datatypes: expected - got CLOB错误,即不一致的数据类型,获得CLOB数据类型。下面是这个问题的症状及对策。
Leshami
2018/08/13
2.5K0
Oracle连接字符串函数listagg()和wmsys.wm_concat()用法简介
介绍:其函数在Oracle 11g 版本中推出,对分组后的数据按照一定的排序进行字符串连接。
星哥玩云
2022/08/16
3.8K0
oracle里面concat函数用法,oracle wm_concat函数用法-Oracle
SQL> create table idtable (id number,name varchar2(30));
全栈程序员站长
2022/08/30
1.8K0
尽量使用LISTAGG代替WM_CONCAT
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/11/29 18:37:29
overme
2022/01/17
4K0
尽量使用LISTAGG代替WM_CONCAT
Oracle|字符串特殊处理
某需求表环节处理人字段存储的是用户的工号,由于有多人的情况,所以该表在数据存储时是以英文逗号分开存储的。
Java小技巧
2022/05/23
1.4K0
Oracle|字符串特殊处理
oracle的listagg函数_oracle的listagg函数
大家好,又见面了,我是你们的朋友全栈君。 Oracle11.2新增了LISTAGG函数,可以用于字符串聚集,测试如下: 1,版本 SQL> select * from v$version; BANNER ——————————————————————————– Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production PL/SQL Release 11.2.0.1.0 – Production CORE 11.2.0.1.0 Production TNS for Linux: Version 11.2.0.1.0 – Production NLSRTL Version 11.2.0.1.0 – Production 2,测试数据 SQL> SQL> select empno,ename,deptno from scott.emp; EMPNO ENAME DEPTNO —– ———- —— 7369 SMITH 20 7499 ALLEN 30 7521 WARD 30 7566 JONES 20 7654 MARTIN 30 7698 BLAKE 30 7782 CLARK 10 7788 SCOTT 20 7839 KING 10 7844 TURNER 30 7876 ADAMS 20 7900 JAMES 30 7902 FORD 20 7934 MILLER 10 14 rows selected 3,作为聚集函数 SQL> SELECT deptno, 2 LISTAGG(ename, ‘,’) WITHIN GROUP(ORDER BY ename) AS employees 3 FROM scott.emp 4 GROUP BY deptno; DEPTNO EMPLOYEES —— ——————————————————————————– 10 CLARK,KING,MILLER 20 ADAMS,FORD,JONES,SCOTT,SMITH 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD SQL> –更换排序列 SQL> SELECT deptno, 2 LISTAGG(ename, ‘,’) WITHIN GROUP(ORDER BY hiredate) AS employees 3 FROM scott.emp 4 GROUP BY deptno; DEPTNO EMPLOYEES —— ——————————————————————————– 10 CLARK,KING,MILLER 20 SMITH,JONES,FORD,SCOTT,ADAMS 30 ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES –order by必须存在 SQL> SELECT deptno, 2 LISTAGG(ename, ‘,’) WITHIN GROUP() AS employees 3 FROM scott.emp 4 GROUP BY deptno; SELECT deptno, LISTAGG(ename, ‘,’) WITHIN GROUP() AS employees FROM scott.emp GROUP BY deptno ORA-30491: ORDER BY 子句缺失 SQL> SELECT deptno, 2 LISTAGG(ename, ‘,’) WITHIN GROUP(order by null) AS employees 3 FROM scott.emp 4 GROUP BY deptno; DEPTNO EMPLOYEES —— ——————————————————————————– 10 CLARK,KING,MILLER 20 ADAMS,FORD,JONES,SCOTT,SMITH 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD ==〉按字母顺序排列 4,LISTAGG作为分析函数使用 SQL> SELECT empno, 2 ename, 3 deptno, 4 LISTAGG(ename, ‘,’) WITHIN GROUP(ORDER BY ename) over(partition by deptno) AS employees 5 FROM sco
全栈程序员站长
2022/10/04
9540
oracle 拼接字符串的函数写法
需求:首先根据角色ID (JSID) 查到角色组ID (JSZID),根据角色组ID (JSZID) 找到对应权限的文档ID (DOCID) 根据文档ID (DOCID) 找到附件的ID (FIEFLID) 根据附件ID找到附件编号(filebh) 附件名称(filemc) 附件后缀名(fileex)
全栈程序员站长
2022/11/05
6360
Oracle 20c 不再支持特性:传统审计不支持 统一审计(Unified Auditing)成主流
在Oracle 20c 中,传统审计(Traditional Auditing)不再支持,统一审计(Unified Auditing)成为主流。
数据和云01
2020/03/19
9310
常用Oracle语句
相信开发的朋友会有这样一种感慨,sql写的好,能够大大减少java代码的编写,尤其对于强大的Oracle来说熟练掌握sql尤为重要,之前用过很多的oracle函数,由于没有总结很容易忘记
在水一方
2022/06/14
6500
oracle:wm_concat函数与oracle版本
oracle中有一个看似很NB的内置函数wm_concat,可以方便的实现“行转列”功能(相关用法,大家自行搜索一下,能找到很多资料) 今天偶然发现一个问题: 在不同的oracle版本中,wm_con
菩提树下的杨过
2018/01/24
1.8K0
oracle:wm_concat函数与oracle版本
OB 运维 | Oracle 迁移到 OB 过程中的函数改造案例
客户源数据库(Oracle)中有使用 XMLAGG 函数对列拼接的需求。通过查询官方文档发现 OceanBase 3.x 版本不支持 XMLAGG 相关函数,故使用 WM_CONCAT 函数进行适配改造。在初步改造后发现实际输出结果并没有排序,通过加 HINT 进行改造优化后,实现与预期一致的结果。
爱可生开源社区
2024/11/06
1290
OB 运维 | Oracle 迁移到 OB 过程中的函数改造案例
wm_concat()和group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别
原标题:oracle的wm_concat()和mysql的group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别
小小鱼儿小小林
2020/06/24
9.1K0
Oracle列转行函数wm_concat版本不兼容解决方案
本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好。这个函数在Oracle12是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用。最近遇到这个问题,网上博客很多都写到了自定义列转行函数的办法去解决。但是这种办法并不一定适用所有的业务场景。我并没有采用。不过有些场景还是可以使用的。
SmileNicky
2022/05/07
1.1K0
回归朴素、oracle注入
Oracle和MySQL数据库语法大致相同,结构不太相同,对于“数据库”这个概念而言,Oracle采用了”表空间“的定义。数据文件就是由多个表空间组成的,这些数据文件和相关文件形成一个完整的数据库。当数据库创建时,Oracle 会默认创建五个表空间:SYSTEM、SYSAUX、USERS、UNDOTBS、TEMP。
字节脉搏实验室
2020/11/06
9190
回归朴素、oracle注入
【DB笔试面试467】Oracle中行列互换有哪些方法?
行列转换包括以下六种情况:(1)列转行。(2)行转列。(3)多列转换成字符串。(4)多行转换成字符串。(5)字符串转换成多列。(6)字符串转换成多行。其中,重点是行转列和字符串转换成多行。
AiDBA宝典
2019/09/29
1.8K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
Oracle列转行函数vm_concat使用
今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)…这种格式。这就想到oracle的列转行函数vm_concat。 可以用类似这种格式wm_concat(a || ‘(’ || b || ‘)’),a表示用户名字段,b表示账号字段。 例子:
SmileNicky
2019/01/17
5.9K0
推荐阅读
相关推荐
【DB笔试面试459】ORA-00904: "wm_concat":invalid identifier错误如何解决?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验