【引言】
个人公众号之前的一篇文章曾经介绍过无效对象的问题。介绍到在数据库日常运维中,数据库中一些对象(如: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.csdn.net/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.csdn.net/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.csdn.net/sinat_36257389/article/details/81004843

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

  1. oracle11g ora 00904,【排故篇_oracle11g升19c之ORA-00904 WM_CONCAT invalid identifie排故

    [引言] 个人公众号之前的一篇文章曾经介绍过无效对象的问题.介绍到在数据库日常运维中,数据库中一些对象(如:Package.Procedure.Function.View.同义词等会失效,状态为INV ...

  2. OGG|利用 OGG 迁移 Oracle11g 到 19C

    作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT) 大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来学习利用 OGG 迁移 Ora ...

  3. 传统手工排程痛点多,带您了解APS高级计划排程系统

    目前,市场逐步走向个性化.以销定产模式:生产逐步以多品种小批量形成存在.对于离散制造行业,APS是为解决多工序.多资源的优化调度问题,而对于流程行业,APS则是为解决顺序优化问题. APS通过为流程和 ...

  4. excel自动排班表怎么做?哪里有免费的自动排班表?2022最新整理30份Excel自动排班表,建议收藏

    你还在手动排班吗?别再这样做了,我有更高效的方法! 在工作中,我们经常需要进行排班,不管是假期值班,还是直播排班,都需要做一个排班表.以前的时候排班都是手动调的,你周一我周二,但这种做法效率比较低,而 ...

  5. seo快排工具真的有用吗?免费SEO手法网站快排技术分享

    SEO快排工具?什么是SEO快排工具,SEO快排工具真的能让网站排名快速起来吗?答案肯定是否定的.任何一款SEO快排工具都不能让排名立马起来,若快排工具真有这么强大的效果,那还需要SEO人员干嘛,大家 ...

  6. mysql 自动排班表_基于jsp+mysql+Spring的Spring自动排班管理系统

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以. IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: 最好是Tomcat 7 ...

  7. php简单排课_基于PHP-WEB网络云环境下的自动排课系统

    基于 PHP-WEB 网络云环境下的自动排课系统 陈佳硕 ; 孙穆赫 ; 付兴建 ; [期刊名称] <信息与电脑:理论版> [年 ( 卷 ), 期] 2013(000)010 [摘要] 随 ...

  8. 大合唱比赛需要排队形,为保持队形对称美观,上台人数为偶数,最中间两人最高,最高的人排在右侧,次高的人排在左侧,然后依次将第三高的排在中间的左侧,第四高的人排在中间的右侧,依照这个规律,将队形排列完

    题目描述 大合唱比赛需要排队形,为保持队形对称美观,上台人数为偶数,最中间两人最高,最高的人排在右侧,次高的人排在左侧,然后依次将第三高的排在中间的左侧,第四高的人排在中间的右侧,依照这个规律,将队形 ...

  9. docker Oracle11G/Oracle 19C安装

    Oracle11G 一.启动新容器 docker run -d -p 7000:1521 \ --name ora_gzns --restart=always \ -v /home/oracle/or ...

最新文章

  1. SQLIOSim 模拟SQLServer的行为来测试IO性能
  2. Could not find destination factory for transport解决方法
  3. Aspx页面中直接编写javascript脚本
  4. 搜索公网上所有使用了SAP BSP技术的网站
  5. cas .net 重定向循环_接口测试平台接入企业cas(一)
  6. ie的window.open 未指明的错误_快递问题公告中错误使用“黑恶势力”等言辞 青岛工学院致歉...
  7. conda install 换源_科学网—Anaconda 报错Multiple Errors Encountered和添加国内镜像以及换源和恢复默认源 - 张伟的博文...
  8. 金融公司大量U盾如何管理
  9. 戴尔R720服务器U盘安装Windows
  10. 遥感影像处理-NDVI
  11. MacOs 查看本地IP和Mac地址
  12. mysql 免安装版 启动_mysql 免安装版服务启动
  13. 电信:自娱自乐的全员揽装,让人心寒!
  14. Proxmark3的编译
  15. UsernamePasswordAuthenticationToken
  16. Webpack 打包commonjs 和esmodule 模块的产物对比
  17. TINA导入SPICE模型
  18. k8s搭建监控:安装metrics server和dashboard
  19. HUAWEI(28)——Vxlan_多子网跨子网互访
  20. arm c语言编译器,ARM C/C++编译器

热门文章

  1. android studio新闻界面,课内资源 - 基于Android Studio实现的新闻APP
  2. LockSupport的park/unpark分析
  3. 【收藏版】Linux常用命令大全
  4. C#——设计一个简单的窗体程序,在文本框中输入两个点的坐标值,单击“确定”按钮时显示两点之间的距离。
  5. meizz (梅花雨)的一些珍藏代码奉献
  6. HBase配置web界面
  7. IMF国际货币基金组织
  8. 深度linux系统任务栏毛玻璃,操作系统中常见的「毛玻璃」效果是怎么设计出来的?...
  9. CocosCreator之KUOKUO带你做双摄像机-单独渲染UI
  10. 16-Seed_expand_and_constrain Three_principles_for_weakly-supervised_image_segmentation