【引言】

个人公众号之前的一篇文章曾经介绍过无效对象的问题。介绍到在数据库日常运维中,数据库中一些对象(如: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的ORACLE_HOME/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 ora 00904,【排故篇_oracle11g升19c之ORA-00904 WM_CONCAT invalid identifie排故相关推荐

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

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

  2. 直播推荐、搜索中的召回、相关性、多目标精排 - 相关性篇

    二.搜索相关性 电商搜索:相关性匹配 - 知乎 上面这篇文章中说的很好,把相关性从简到易分到3种(结构化匹配.文本匹配.语义匹配) I:召回.粗排中用到结构化匹配的方式来控制相关性(query的类目是 ...

  3. 学校排课老师的福音:短短几分钟轻松完成学校排课任务

    距离各个学校开学已经没有多少时间了,学校的教务老师估计已经开始准备新学期的排课工作了, 排课充当着假期的拦路虎,生生让排课老师们假期不得轻松,但是繁重的排课工作又不能拖沓到开学前再去做,因为时间不允许 ...

  4. 自动排课系统的设计与实现 开题报告 java_高校自动排课APP的设计与实现毕业论文+开题报告+app源码(Hbuilder+Android+sqlite+H5)+操作步骤...

    摘  要 传统的人工排课使用手工操作存在许多弊端,如重复劳动严重.效率低下.且不能达到资源的最优化配置等,将产生大量的文件和数据,这对于查找.更新和维护都带来了不少的困难.因此设计一个高校自动排课AP ...

  5. 推荐、搜索、广告中的召回、相关性、多目标精排 - 召回篇

    一.召回 智能推荐算法在直播场景中的应用 - 知乎 花椒直播推荐系统高级算法工程师王洋:智能推荐系统在直播场景中的应用_哔哩哔哩_bilibili 1:基于item的协同过滤(求出来item之间的相似 ...

  6. 手把手使用esp8266一起来做智能插排-硬件篇

    从开始入arduino的坑开始就一直想做个智能插排,从一开始折腾小车.3D打印机.学习esp8266 SDK编程到现在,都对这玩意一直念念不忘.由于之前一直都是从事软件工作,做这个除了需要软件知识还需 ...

  7. 51 单片机 (1) I/O口 按键控制LED之P0口排坑篇

    实验内容 此次实验为利用单片机读取开关的状态从而控制LED的亮灭. 实验环境 仿真软件 Protue 8.9 sp2 IDE Keil5 C51 单片机 AT89C51 Protues仿真图 所用器件 ...

  8. Mysql导入导出亿条数据(排坑篇)

    声明:这是我在大学毕业后进入第一家互联网工作学习的内容 背景:公司业务需要给某个活动的支付宝用户发送模板消息 经调查发现,此次活动的用户数量大约2亿,为了模拟生产环境,领导让我把生产库的用户信息(脱敏 ...

  9. 【排故篇】_啥是无效对象,出现时如何破?

    note-taker:Ethan_Yangrecording time: 2019/09/23number of docs:10 [前言] 大家都知道,在数据库日常运维中,数据库中一些对象(如:Pac ...

最新文章

  1. 软件开发过程中遇到的问题
  2. 模拟信号与数字信号以及数模隔离简介
  3. php微信回复乱码,php版微信公众平台回复中文出现乱码问题的解决方法
  4. RTEMS实时操作系统精要(2)-FLAGS、EFLAGS寄存器
  5. 2019安恒七月月赛——MISC
  6. 单片机与普通微型计算机不同在于,单片机与普通微型计算机的不同之处
  7. 连接设备不支持android,安卓手机不识别U盘、不能连接PC的处理方法
  8. 整理索引碎片,提升SQL Server速度 SQL Server“吃内存”的解决(转载)
  9. RapidXml读取并修改XML文件
  10. Mysql-多表查询
  11. 舆情监测产品的过去与现在
  12. 微信模拟地理位置_微信电脑版伪装地理位置的方法
  13. java实现短视频拍摄_短视频 SDK 6大功能技术实现方式详解
  14. 集合框架的理解与总结
  15. 3大类6种排序 插入排序 选择排序 冒泡排序 希尔排序 堆排序 快速排序 —————— 开开开山怪
  16. mysql创建表报错1055的原因_MySQL 报错 1055
  17. 移动web JavaScript,事件(touchstart,touchmove,touchend)
  18. html5 arc 椭圆,html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
  19. python能打包成apk吗_超详细APK打包教程
  20. AdGuard添加规则方法

热门文章

  1. python 报错 invalid value 2_【python】错误解决经历
  2. TFS实战培训 - 博时基金公司 (2016年8月)
  3. Webfrom --中国直辖市三区联动
  4. matlab、python打字变红,格式错误问题
  5. 《数据密集型计算和模型》第二章大数据时代的计算机体系结构复习
  6. #1830 : Cheat
  7. 脉冲函数、阶跃函数和斜坡函数及脉冲响应
  8. 也谈《人间正道是沧桑》中的破绽
  9. 江苏大学计算机考研上岸分享
  10. 【51单片机】室友用一把王者时间,学会了去使用数码管。