【生产排故】oracle11g升19c之ORA-00904 WM_CONCAT invalid identifie排故

oracle报错(ORA-06575: 程序包或函数 WM_CONCAT 处于无效状态) 之前的项目突然出现一个错误,ORA-06575: 程序包或函数 WM_CONCAT 处于无效状态。之前都是正常的,感觉很奇怪,百度下是因为。 阅读详情

【引言】
个人公众号之前的一篇文章曾经介绍过无效对象的问题。介绍到在数据库日常运维中,数据库中一些对象(如:Package、Procedure、Function、View、同义词等会失效,状态为INVALID,需定期检查数据库中存在哪些失效对象。自动失效的对象,一般会在下次调用的时候,会被重新编译,所以一般也不需要人工干预。对于存在异常的对象则需要手动重新编译;一个场景就是数据迁移也会导致无效对象的产生。

《Oracle番:啥是无效对象,出现时如何破?》

最近的一次oracle库大版本升级,版本从11g升级至19c;按照《Oracle番:啥是无效对象,出现时如何破?》,升级至19c后,执行如下utlrp.sql脚本编译了数据库失效对象后,还是有个应用账号报无效对象编辑失效的现象。
sql>@$ORACLE_HOME/rdbms/admin/utlrp.sql

报错信息如下:
ORA-00904: “WM_CONCAT”: invalid identifie

经了解,wm_contact(column)函数从oracle10g开始使用,然而12C以上版本摒弃了wm_concat函数,导致不能识别"WM_CONCAT"函数。大家都知道,WM_CONCAT"可以实现oracle中字段的合并,wm_concat(列名)函数,能把指定的列的值,按照group by 中指定的分隔方法,用逗号拼接起来。通常用法如下例:

#通用用法
select id,wm_concat(test) result
from test
group by id;

#使用时记得用to_char()封装下
select id,to_char(wm_concat(test)) result
from test
group by id;

注意:
实际使用中,需用to_char(wm_concat())方式封装,方可正常调用。

至于为何oracle在12c的版本中抛弃不用wm_contact(column)?
个人这里大致推测下:应该和函数执行效率低有关,因为用过的朋友有切身体会,万行的查询合并,执行时间较长。另,wm_contact英文描述为undocumented,意味着随时可能发生变更;10.2.0.5上,其返回类型从varchar2变为了clob,12c后续版本,直接就取消了此函数。用到此函数的数据库发生大版本升级,如本人的11g升级19c,就是一大坑,因升级后如不注意,应用在进行功能性测试时,肯定出问题。

后续作者将继续研究下,也欢迎大家留言讨论oracle弃用wm_contact的原因。

本次升级,11g中版本对应的应用程序中使用了wm_contact该函数,升级后的19c没有此wmsys.wm_contact函数,故致使所以来的view和package报错,出现如下:
ORA-00904: “WM_CONCAT”: invalid identifie

问题如何解决?

解决方案有三种:
方法1:19c中创建低版本的wm_contact函数;
方法2:19c中手动创建wm_contact函数;
方法3:使用其替代函数,listagg

方法1创建wm_contact函数
从原有低版本11g中copy相应的文件,在19c中执行创建wm_contact函数;具体如下:
从11g的ORACLEHOME/rdbms/admin目录下拷贝owmctab.plb、owmaggrs.plb、owmaggrb.plb三个文件至19c的ORACLE_HOME/rdbms/admin目录下拷贝owmctab.plb、owmaggrs.plb、owmaggrb.plb三个文件至19c的ORACLEH​OME/rdbms/admin目录下拷贝owmctab.plb、owmaggrs.plb、owmaggrb.plb三个文件至19c的ORACLE_HOME/rdbms/admin/目录下。然后依次执行owmctab.plb、owmaggrs.plb、owmaggrb.plb这三个文件。

查看owmctab.plb脚本内容,因owmctab.plb需要引用owmt9012.plb,而owmt9012.plb需要引用owmt9013.plb,故需要需要从11g中scp到19C中,如下共计5个文件。
owmctab.plb
owmt9013.plb
owmt9012.plb
owmaggrs.plb
owmaggrb.plb

19c中oracle环境下依次执行如下命令:
SQL> @?/rdbms/admin/owmctab.plb
SQL> @?/rdbms/admin/owmaggrs.plb
SQL> @?/rdbms/admin/owmaggrb.plb

方法2:19c中手动创建wm_contact函数
参考如下链接:
https://blog.youkuaiyun.com/alicewang99/article/details/89945252

创建wm_concat函数
–首先使用dba账号登录oracle数据库
–解锁wmsys用户
alter user wmsys account unlock;

–并为wmsys用户授权,可根据需要授权,不建议授权所有权限
grant all privileges to wmsys;

–如果不知道wmsys用户的密码,可以修改其密码
alter user wmsys identified by 123456;

–使用wmsys用户登录数据库
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_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 ;
/

–创建完成,给其创建同义词及授权,以供其他用户能正常使用。
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
/

方法3:使用替代函数listagg
参考链接:
https://blog.youkuaiyun.com/sinat_36257389/article/details/81004843
使用listagg函数代替
基本语法:
SELECT
T .DEPTNO,
listagg (T.ENAME, ‘,’) WITHIN GROUP (ORDER BY T.ENAME) names
FROM
SCOTT.EMP T
WHERE
T.DEPTNO = ‘20’
GROUP BY
T.DEPTNO

本文采用了方法1。

【结语】
1.个人进行oracle11g升级12c以上大版本的升级案例中,所遇到的第一个大坑;各位亲,请留意。
2.至于oracle官方为何弃用wm_contact函数,文中个人初步推断为该函数执行效率低的原因,后续具体原因,文章待定。
3.Oracle大版本后的升级,一定要谨慎再谨慎,充分做好应用测试。

【参考】
https://www.cnblogs.com/YuyuanNo1/p/7910714.html
【参考】
https://blog.youkuaiyun.com/sinat_36257389/article/details/81004843

ORA-06575: Package or function WM_CONCAT is in an invalid state解决方法 自己创建WM_CONCAT函数。 阅读详情

相关推荐

ORACLE19C重建WM_CONCAT函数

CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT -- AUTHID CURRENT_USER 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,

cqszpx的博客 2463

ORA-00904: “WM_CONCAT“: invalid identifier 解决方案

Oracle踩坑日记之"WM_CONCAT": invalid identifier

花生了什么树的博客 7160

ORA-00904: "WM_CONCAT": 标识符无效

oracle19c缺少的函数

oracle12版本提示没有wm_concat函数(ORA-00904:“WM_CONCAT“:invalid identifier)

1、使用wm_concat会提示如下错误 2、使用如下命令登录到sqlplus中: sqlplus -logon sys/admin1 as sysdba; 如下图所示: 3、依次执行如下命令: --首先使用dba账号登录oracle数据库 --解锁wmsys用户 alter user wmsys account unlock; --并为wmsys用户授权,可根据需要授权,不建议授权所有权限 grant all privileges to wmsys; --如果不知道wmsys

sxj的专栏 5395

oracle合并列的函数wm_concat的使用详解

oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oracle wm_concat(column)函数实现字段合并,如果您对oracle wm_concat(column)函数使用方面感兴趣的话,不妨一看。shopping:—————————————–u_id       goods            num——————————————1                苹果                22                 梨子               51                 西瓜               4

Nvidia Jetson AGX Orin 如何进入 Recovery Mode(刷机注意事项)

Jetson Orin 如何进入Recovery mode + 刷机注意事项

Pandako's Blog 1万+

Oracle: ORA-00904 WM_CONCAT invalid identifier 解决方案

由于技术架构的调整,数据库需要进行迁移,将表和存储过程从Oracle数据库迁移到另外一个Oracle数据库,在存储过程迁移过程中,遇到个问题,使用WM_CONCAT的存储过程编译不会通过,并且报 ORA-00904: "WM_CONCAT": invalid identifier 错误。在查一些资料后,发现11gr2之后的版本中WM_CONCAT函数已经弃用,而应用在程序中确使用了该函数,导致程序出现错误。

日常工作记录,解决实际问题,不成体系。 1125

一文读懂无人机AI识别算法,原理、技术、应用

本文详细介绍了无人机识别算法的工作原理、技术优势以及在多个行业的应用前景,展现了其在提升安全监控、资源管理和应急响应中的关键作用。尽管无人机识别算法在多个领域展现出巨大潜力,但仍面临技术挑战,如算法的准确性、数据的实时处理能力以及对复杂环境的适应性。4. 消防与城市管理: 无人机识别算法在消防和城市管理中的应用,为相关部门提供了及时的信息支持,提升了应急处置能力和城市管理水平。1. 公安监控: 无人机识别算法在公安领域的应用,可以实时识别犯罪嫌疑人和违法行为,有效提升城市治安管理的智能化水平。

foiadrone的博客 1847

程序包或函数 WM_CONCAT 处于无效状态

今天运行了很久的项目,点了一下查询突然发现出现了一个 程序包或函数 WM_CONCAT 处于无效状态的问题报错,妈耶,因为啥啊,咋地了,跑了这么就怎么就瘫痪了 废话不多说,找到报错的sql 然后勒,当然是把这个sql扔到PL/SQL 跑一下啊,然后就发现 ” 程序包或函数 WM_CONCAT 处于无效状态” 找到那个函数,完事打一顿,然后再看一下Functions 有没有红色的x...

lvjingbin的博客 1万+

手把手教你用Cursor + 自定义MCP工具链,让AI帮你搞定App逆向(附adb-mcp/frida-mcp源码)

本文详细介绍了如何利用Cursor IDE与自定义MCP工具链构建AI驱动的App逆向工作流,涵盖adb-mcp和frida-mcp的源码实现与实战应用。通过自然语言指令,AI可自动化完成设备控制、动态Hook和数据分析,显著提升移动安全测试效率。适合安全研究人员和开发者快速掌握智能逆向技术。

weixin_33737134的博客 1300

QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型

常用的地图种类分为交通图,地形图,卫星图等等,在QML的Map(以OSM地图为例)中提供activeMapType属性用于读取当前显示的地图类型(注意:该属性为只读属性,不能用于赋值),QML中地图的加载寻找根据瓦片的文件名进行查找,例如名为"osm_100-l-5-2-2-3.png"的瓦片,其中5代表了该地图的类型

zjgo007的专栏 3162

sys.wm_concat 无效问题

运行 project 后后台报错: org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [select wmsys.wm_concat(RoleID) from dlsys.tcrole a,dlsys.tcUnit b,dlsys.tcHuman c where a.Uni...

马丁早上起不来 1497

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 371

oracle解决wm_concat的,varchar 变 clob的问题

CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT – AUTHID CURRENT_USER AS OBJECT ( CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, MEMBER FU...

weixin_43855690的博客 1345

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1522

Windows配置CA证书颁发机构+NPS-DCServer

Windows配置证书颁发机构+NPS-DCServer

新时代先锋的博客 3万+

[Err] ORA-00904: "WM_CONCAT": invalid identifier -oracle12.0后无法使用WMSYS_WMCONCAT()函数 使用listagg替代实现功能

由于WMSYS_CONCAT()只适用于oracle10.0及之前的版本,且该oracle函数并不是官方规定的函数,导致在使用的过程中会发生因为oracle数据库版本升级后,该函数失效,从而使得sql语句报错:[Err] ORA-00904: "WM_CONCAT": invalid identifier 如下述sql语句:   select  WM_CONCAT(STAGE) AS stag...

jia.huang的博客 8687

600份国家自然基金申报书--模板

600份国家自然基金申报书--模板

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 4186

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

ORA-00904: “WM_CONCAT”: 标识符无效 该问题是因为数据库版本没有自带该函数。 解决此问题的方法: 1.下载owmctab.plb、owmaggrs.plb、owmaggrb.plb三个文件; 注:以上三个文件可以在11g版本安装路径下获得 {oracle_home}\product\12.2.0\dbhome_1\rdbms\admin 2.将获得的三个文件放入到下面文件夹内(本人版本19c){oracle_home}\WINDOWS.X64_193000_db_home\rdbms\

LiuTengYan的博客 2697

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java.sql.SQLSyntaxErrorException: ORA-00904: "WM_CONCAT": 标识符无效

一般docker中安装的XE版本的oracle都会存在java.sql.SQLSyntaxErrorException: ORA-00904: "WM_CONCAT": 标识符无效。当因为oracle版本问题导致wm_concat函数无法调用时可用一下语句创建实现。 注:需要使用plsql。 首先登陆system用户为服务配置管理系统的oracle用户(例如SCMS)授权: GRANT cr...

能量守恒洛的专栏 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Oracle|19C升级WM_CONCAT函数失效

​1.1 问题背景 最近项目Oracle数据库升级由11g升到19C,在验证过程中发现wm_concat函数竟然失效了。 经过网上查询资料发现,wm_concat函数是oracle的非公开函数,在新版的oracle中不支持该函数。 1.2 解决方案 因该函数在代码中使用次数过多,在不改动代码前提下,选择重新创建该函数。建议后续在开发过程中不建议再使用该函数。 1.3 实施步骤 首先使用dba账号登录oracle数据库(使用oracle / root用户执行) sqlplus / as sysdba –

Java小技巧 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

owmctab.plb oracle,ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier

同事玩 Docker ,在 Docker 里面启了一个 Oracle 10g Express 版本,在测试过程中遇到了 ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier 错误。SQL> select * from v$version;BANNER------------------------------------------------...

weixin_39802962的博客 444

wm_concat标识符无效_ORA-00904:"WM_CONCAT":标识符无效

今天客户现场业务甩给我一个报错让处理,ora-00904:"WM_CONCAT":标识符无效。初步分析了下场景:前天因为在原先一套库要删除,而他们业务用户A使用的便是该套计划删除的库,故导出A用户,导入到新环境中,expdp/impdp导入导出中均无报错。昨天在新环境给恢复成功,今天业务反映有报错,在新环境中查看确实没有该function,而老环境中有该function,但是是用户B的,猜测之前老...

weixin_39989941的博客 3051

ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier

  同事玩Docker,在Docker里面启了一个Oracle 10g Express版本,在测试过程中遇到了ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier错误。     SQL> select * from v$version; BANNER-----------------------------------------------...

weixin_34249367的博客 911

ORACLE常见问题:ORA-00904:"WM_CONCAT":标识符无效

"WM_CONCAT"可以实现oracle中字段的合并,可以说功能很强大。但是不知何故,oracle从11g以后,屏蔽了"WM_CONCAT"函数,导致出现了不能之别"WM_CONCAT"函数。针对这个问题我提供了两种解决方案,当然,在之前要准备好三个文件:owmctab.plb\owmaggrs.plb\owmaggrb.plb。方法一:1、通过sqlplus免密码登录oracle: sqlpl...

梁海江的博客 2万+

解决WM_CONCAT()函数无法使用的问题

解决WM_CONCAT()函数无法使用的问题 在11GR2的数据库上,将以下文件传输到所需的数据库服务器上的$ORACLE_HOME/rdbms/admin目录 owmctab.plb owmaggrs.plb owmaggrb.plb owmt901*.plb 然后进入sqlplus,执行 @?/rdbms/admin/owmctab.plb; @?/rdbms/admin/owmaggrs.plb; @?/rdbms/admin/owmaggrb.plb; 例如: ...

u012556249的博客 2583
上一篇: LINUX环境下三节点服务器如何配置互信
下一篇: 【学习篇】_今天聊一聊一种学习方法:复盘
db_murphy
博客等级 码龄11年 145粉丝 197原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值