今天客户现场业务甩给我一个报错让处理,ora-00904:"WM_CONCAT":标识符无效。

初步分析了下场景:

前天因为在原先一套库要删除,而他们业务用户A使用的便是该套计划删除的库,故导出A用户,导入到新环境中,expdp/impdp导入导出中均无报错。昨天在新环境给恢复成功,今天业务反映有报错,在新环境中查看确实没有该function,而老环境中有该function,但是是用户B的,猜测之前老环境是给A建立了B的synonym。

解决方法:

1、获取创建该函数的DDL语句,在新环境中直接创建该function

SQL> set long 999

SQL> select dbms_metadata.get_ddl('FUNCTION','WM_CONCAT','TBCS') from dual;

DBMS_METADATA.GET_DDL('FUNCTION','WM_CONCAT','TBCS')

--------------------------------------------------------------------------------

CREATE OR REPLACE EDITIONABLE FUNCTION "TBCS"."WM_CONCAT" (P1 VARCHAR2)

RETURN clob AGGREGATE USING  WM_CONCAT_IMPL;

执行DDL语句

SQL> CREATE OR REPLACE EDITIONABLE FUNCTION "AOPEN"."WM_CONCAT" (P1 VARCHAR2) RETURN clob AGGREGATE USING  WM_CONCAT_IMPL;

2  /

Warning: Function created with compilation errors.

SQL>

此操作后,明显报错了,让业务测试,肯定测不过,查看函数是无效的

SQL> select OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_TYPE,LAST_DDL_TIME from dba_objects where object_name=upper('wm_concat') ;

OWNER                OBJECT_NAME                    SUBOBJECT_NAME                 OBJECT_TYPE             LAST_DDL_TIME

-------------------- ------------------------------ ------------------------------ ----------------------- ---------------

A                    WM_CONCAT                                                     FUNCTION                20191121 172355

SQL>

2、导出function在导入新环境

由于第一种方法不行,故考虑第二种方法,把老环境B用户的wm_concat函数迁移到新环境,测试可行否

导出function

expdp \'/ as sysdba \' directory=expdp_2019 dumpfile=function_wm_concat_20191121.dmp logfile=function_wm_concat_expdp_20191121.log schemas=B include=function:\"IN \'WM_CONCAT\'\"

Export: Release 12.1.0.2.0 - Production on Thu Nov 21 17:46:38 2019

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics

and Real Application Testing options

Starting "SYS"."SYS_EXPORT_SCHEMA_02":  "/******** AS SYSDBA" directory=expdp_2019 dumpfile=function_wm_concat_20191121.dmp logfile=function_wm_concat_expdp_20191121.log schemas=B include=function:"IN 'WM_CONCAT'"

Estimate in progress using BLOCKS method...

Total estimation using BLOCKS method: 0 KB

Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION

Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION

Master table "SYS"."SYS_EXPORT_SCHEMA_02" successfully loaded/unloaded

******************************************************************************

Dump file set for SYS.SYS_EXPORT_SCHEMA_02 is:

/ora12c/oracle/dir_dump/function_wm_concat_20191121.dmp

Job "SYS"."SYS_EXPORT_SCHEMA_02" successfully completed at Thu Nov 21 17:47:27 2019 elapsed 0 00:00:47

导入新环境,使用户转换,由B转换为A

impdp \'/ as sysdba \' directory=DIR_DUMP dumpfile=function_wm_concat_20191121.dmp logfile=function_wm_concat_impdp_20191121.log remap_schema=B:A

Import: Release 12.1.0.2.0 - Production on Thu Nov 21 17:48:53 2019

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics

and Real Application Testing options

Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" directory=DIR_DUMP dumpfile=function_wm_concat_20191121.dmp logfile=function_wm_concat_impdp_20191121.log remap_schema=B:A

Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION

Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION

ORA-39082: Object type FUNCTION:"AOPEN"."WM_CONCAT" created with compilation warnings

Job "SYS"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Thu Nov 21 17:49:00 2019 elapsed 0 00:00:05

查看函数状态,依旧invalid

SQL> select owner,object_name,object_type ,status from dba_objects where owner not in('SYS', 'SYSTEM') AND status != 'VALID' ;

OWNER                          OBJECT_NAME                    OBJECT_TYPE             STATUS

------------------------------ ------------------------------ ----------------------- -------

A                               WM_CONCAT                      FUNCTION                INVALID

3、手工创建该函数

考虑到第一种方法只是创建了function,而包体等内容并没有创建,故手工创建package、body、function

a、以sys用户创建包、包体、函数

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

);

b、创建类型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;

c、创建函数

CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;

d、创建同义词并授权

create public synonym WM_CONCAT_IMPL for sys.WM_CONCAT_IMPL

create public synonym wm_concat for sys.wm_concat

grant execute on WM_CONCAT_IMPL to public

grant execute on wm_concat to public

然后查看function状态,正常状态。至此问题解决。

总结

1、从网上找资料了解到,11gr2和12C上已经摒弃了wm_concat函数,而应用在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的应用。

2、也查到了说VMSYS用户下有该函数,但是默认该用户是锁定的,此次问题我也解锁了VMSYS用户,但是并无该function

SQL> alter user WMSYS account unlock;

User altered.

SQL>  select owner,object_name,object_type from dba_objects where owner='WMSYS' and object_type ='FUNCTION';

no rows selected

3、手工重建,保留脚本以后出现类似问题可以很快速重建。

wm_concat标识符无效_ORA-00904:WM_CONCAT:标识符无效相关推荐

  1. 命名规则标识符 unix_关于全局唯一标识符

    关于全局唯一标识符 用几个世纪以来独一无二的标签命名你的接口 摘要 本文介绍全局唯一标识符(GUID:Globally Unique IDentifier ),并说明如何从您喜欢的工作站创建一个.它包 ...

  2. python自定义变量名标识符,【python】3 标识符和关键字

    3 标识符和关键字 3.1 标识符 3.1.1 标识符的定义 开发人员在程序中自定义的一些符合和名称,例如变量名和函数名. 3.1.2 标识符定义的规则 标识符:字母/数字/下划线组成,且数字不能开头 ...

  3. oracle列转行wm_concat,Oracle列转行函数wm_concat版本不兼容解决方案

    业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的.不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不 ...

  4. 【C++】VS中读写操作(fclose.cpp)引发中断——将一个无效参数传递给了将无效参数视为严重错误的函数

    [C++]VS中读写操作(fclose.cpp)引发中断--将一个无效参数传递给了将无效参数视为严重错误的函数 遇到的问题 跑数据测试程序时,突然跳出报错中断信息,显示触发断点,错误如下图所示. 但是 ...

  5. 0x0FF0ED76 (ucrtbased.dll) (Project5.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。 出现了

    void drop(int a)//一个删除deque容器中元素的函数{deque<int>::iterator it;it = kn.begin();kn.erase(it+a);cou ...

  6. findContours函数报错:“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方案之一

    在使用findContours函数时,release可以通过,debug一直在报错:"将一个无效参数传递给了将无效参数视为严重错误的函数". 这里有个大牛汇集的好多种解决方法: h ...

  7. C++ 读取文件时报错“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方法

    ** C++ 读取文件时报错"将一个无效参数传递给了将无效参数视为严重错误的函数"解决方法 最近在运行工程时需要读取stl网格文件,但是在运行时发现报错如下: 但是之前运行过一个测 ...

  8. findContours函数报错:“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方案

    先说一下出错时的环境配置:Win10+VS2015+OpenCV3.2.0 在编写火焰检测程序时候,用到findCoutours函数提取火焰边缘轮廓,以便找寻静态特征.但是在调试运行时,弹出:&quo ...

  9. VScommunity2019 0x00007FFCCA14B7EC (ucrtbased.dll) (Project1.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误

    0x00007FFCCA14B7EC (ucrtbased.dll) (Project1.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数. 读某一个文件,但是并没 ...

  10. 0x00007FFE9071C408 (ucrtbase.dll) (xxx.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。

    1.调试VS程序,弹出异常:0x00007FFE9071C408 (ucrtbase.dll) (xxx.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数. 2.在 ...

最新文章

  1. KlayGE 4.2开发计划
  2. 专访 Christian Posta:Istio 1.7 将成为生产可用的最稳定版本
  3. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
  4. vue插槽面试题_关于前端Vue框架的面试题,面试官可能会问到哪些。?
  5. python开发安卓盒子_Python盒子:模块、包和程序
  6. Android Studio 主题、字体大小的设置
  7. echarts自定义象形图,矢量图标
  8. 全方位了解8.0系统下的Handler
  9. word文字怎么竖向排列_word怎么把字体竖着 如何在WORD中竖排文字
  10. 解析阿里“聚石塔”产品
  11. 洛谷 桶哥的问题——送桶——题解
  12. 7.去空格函数-strip
  13. 用U盘制作PE启动盘
  14. vue表格某一列的显示与隐藏
  15. Android不错的图片压缩方法,圆我大厂梦
  16. QSL语句大全(3)
  17. vue中获取获取当前城市地址_Vue中获取当前定位城市名
  18. easyexcel 列宽、行高、样式
  19. VR交互动画短片《拾梦老人》的开发经历
  20. 过NAT的SIP通信环境搭建

热门文章

  1. 利用zabbix api批量添加数百台监控主机
  2. 快速定位函数指针所指向的函数原型
  3. 如何查看container工作在哪种网络模式
  4. 产品新人必看:入职前的准备及快速适应产品工作
  5. 中科院数学所计算机科学与技术,张松懋 - 中国科学院大学 - 计算机科学与技术学院...
  6. 八大排序,你都掌握了吗?
  7. 【OpenCV 例程 300 篇】107. 退化图像的维纳滤波
  8. 全透明机箱侧板-diy机箱侧板-侧板定制-定制盖板-侧板
  9. 函数项级数的一致收敛
  10. MD5算法C语言实现