今天客户现场业务甩给我一个报错让处理,ora-00904:"WM_CONCAT":标识符无效。
初步分析了下场景:
前天因为在原先一套库要删除,而他们业务用户A使用的便是该套计划删除的库,故导出A用户,导入到新环境中,expdp/impdp导入导出中均无报错。昨天在新环境给恢复成功,今天业务反映有报错,在新环境中查看确实没有该function,而老环境中有该function,但是是用户B的,猜测之前老环境是给A建立了B的synonym。
解决方法:
1、获取创建该函数的DDL语句,在新环境中直接创建该function
执行DDL语句
此操作后,明显报错了,让业务测试,肯定测不过,查看函数是无效的
2、导出function在导入新环境
由于第一种方法不行,故考虑第二种方法,把老环境B用户的wm_concat函数迁移到新环境,测试可行否
导出function
导入新环境,使用户转换,由B转换为A
查看函数状态,依旧invalid
3、手工创建该函数
考虑到第一种方法只是创建了function,而包体等内容并没有创建,故手工创建package、body、function
a、以sys用户创建包、包体、函数
b、创建类型body
c、创建函数
d、创建同义词并授权
然后查看function状态,正常状态。至此问题解决。
总结
1、从网上找资料了解到,11gr2和12C上已经摒弃了wm_concat函数,而应用在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的应用。
2、也查到了说VMSYS用户下有该函数,但是默认该用户是锁定的,此次问题我也解锁了VMSYS用户,但是并无该function
3、手工重建,保留脚本以后出现类似问题可以很快速重建。