ORA-00904:"WM_CONCAT":标识符无效
今天客户现场业务甩给我一个报错让处理,ora-00904:"WM_CONCAT":标识符无效。
初步分析了下场景:
前天因为在原先一套库要删除,而他们业务用户A使用的便是该套计划删除的库,故导出A用户,导入到新环境中,expdp/impdp导入导出中均无报错。昨天在新环境给恢复成功,今天业务反映有报错,在新环境中查看确实没有该function,而老环境中有该function,但是是用户B的,猜测之前老环境是给A建立了B的synonym。
解决方法:
1、获取创建该函数的DDL语句,在新环境中直接创建该function
|
1
2
3
4
5
6
|
SQL> set long 999SQL> 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语句
|
1
2
3
4
|
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> |
此操作后,明显报错了,让业务测试,肯定测不过,查看函数是无效的
|
1
2
3
4
5
|
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 172355SQL> |
2、导出function在导入新环境
由于第一种方法不行,故考虑第二种方法,把老环境B用户的wm_concat函数迁移到新环境,测试可行否
导出function
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 2019Copyright (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 ProductionWith the Partitioning, Automatic Storage Management, OLAP, Advanced Analyticsand Real Application Testing optionsStarting "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 KBProcessing object type SCHEMA_EXPORT/FUNCTION/FUNCTIONProcessing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTIONMaster 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.dmpJob "SYS"."SYS_EXPORT_SCHEMA_02" successfully completed at Thu Nov 21 17:47:27 2019 elapsed 0 00:00:47 |
导入新环境,使用户转换,由B转换为A
|
1
2
3
4
5
6
7
8
9
10
11
12
|
impdp \'/ as sysdba \' directory=DIR_DUMP dumpfile=function_wm_concat_20191121.dmp logfile=function_wm_concat_impdp_20191121.log remap_schema=B:AImport: Release 12.1.0.2.0 - Production on Thu Nov 21 17:48:53 2019Copyright (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 ProductionWith the Partitioning, Automatic Storage Management, OLAP, Advanced Analyticsand Real Application Testing optionsMaster table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloadedStarting "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:AProcessing object type SCHEMA_EXPORT/FUNCTION/FUNCTIONProcessing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTIONORA-39082: Object type FUNCTION:"AOPEN"."WM_CONCAT" created with compilation warningsJob "SYS"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Thu Nov 21 17:49:00 2019 elapsed 0 00:00:05 |
查看函数状态,依旧invalid
|
1
2
3
4
|
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用户创建包、包体、函数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPLISSTATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)RETURN NUMBERISBEGINSCTX := WM_CONCAT_IMPL(NULL) ;RETURN ODCICONST.SUCCESS;END;MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,P1 IN VARCHAR2)RETURN NUMBERISBEGINIF(CURR_STR IS NOT NULL) THENCURR_STR := CURR_STR || ',' || P1;ELSECURR_STR := P1;END IF;RETURN ODCICONST.SUCCESS;END;MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,RETURNVALUE OUT VARCHAR2,FLAGS IN NUMBER)RETURN NUMBERISBEGINRETURNVALUE := CURR_STR ;RETURN ODCICONST.SUCCESS;END;MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,SCTX2 IN WM_CONCAT_IMPL)RETURN NUMBERISBEGINIF(SCTX2.CURR_STR IS NOT NULL) THENSELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;END IF;RETURN ODCICONST.SUCCESS;END;END; |
c、创建函数
|
1
|
CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ; |
d、创建同义词并授权
|
1
2
3
4
|
create public synonym WM_CONCAT_IMPL for sys.WM_CONCAT_IMPLcreate public synonym wm_concat for sys.wm_concatgrant execute on WM_CONCAT_IMPL to publicgrant execute on wm_concat to public |
然后查看function状态,正常状态。至此问题解决。
总结
1、从网上找资料了解到,11gr2和12C上已经摒弃了wm_concat函数,而应用在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的应用。
2、也查到了说VMSYS用户下有该函数,但是默认该用户是锁定的,此次问题我也解锁了VMSYS用户,但是并无该function
|
1
2
3
4
|
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、手工重建,保留脚本以后出现类似问题可以很快速重建。
ORA-00904:"WM_CONCAT":标识符无效的更多相关文章
- Oracle 多行拼接函数 :[Err] ORA-00904: "WM_CONCAT": 标识符无效
SELECT LISTAGG(GOODSNAME,';') WITHIN GROUP (ORDER BY GOODSNAME) AS sd WM_CONCAT() 方法被替代成:LISTAGG(GO ...
- ORA-00904: "B"."METHOD": 标识符无效,00904. 00000 - "%s: invalid identifier"
1 SELECT COUNT(1) FROM (SELECT a.id AS "id", a.district AS "district", a.company ...
- ORA-00904:"T1"."AREA_ID" :标识符无效
1.错误描述 ORA-00904:"T1"."AREA_ID" :标识符无效 00904 . 00000 - "%s:invalid identifi ...
- ORA-00904:标识符无效
1.错误描述 ORA-00904:"TTT"."RN":标识符无效 00904 . 00000 - "%s:invalid identifier&qu ...
- Oracle建表提示SQL 错误: ORA-00904: : 标识符无效
Oracle建表提示: 错误报告:SQL 错误: ORA-00904: : 标识符无效00904. 00000 - "%s: invalid identifier"*Cause: ...
- ORA-00904:"T1"."AREA_ID" :标识符无效
1.错误描写叙述 ORA-00904:"T1"."AREA_ID" :标识符无效 00904 . 00000 - "%s:invalid identi ...
- java.sql.SQLSyntaxErrorException: ORA-00904: "column": 标识符无效
java.sql.SQLSyntaxErrorException: ORA-00904: "column": 标识符无效 首先查看无效的列是不是orcale关键字 , 如果不是 , ...
- oracle表或视图不存在和标识符无效的问题解决
通过dbvisualizer修改表的名字时,一定要改成大写,否则会报错,数据库中没有该表的错误. 如果新的表名为小写,不行! select的时候,可以用小写名. 标识符无效解决:字段名默认都是大写的, ...
- ORA-00904: 标识符无效——解决方案
转自:https://blog.csdn.net/jajavaja/article/details/49122639 建表时列名用双引号引着(用Navicat工具建表默认是加上双引号的),java连接 ...
随机推荐
- Unity3D for iOS初级教程:Part 3/3(下)
转自:http://www.cnblogs.com/alongu3d/archive/2013/06/01/3111739.html 消息不会自动消除 你基本的游戏功能已经完成了,但是显示一些关于游戏 ...
- Spring Cloud第九篇 | 分布式服务跟踪Sleuth
本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- contiue和break的用法
contiue和break的作用分别是什么: 1.continue的意思是终止本次循环,直接进入下一次循环. 注意: continue不能加在循环体的最后一步执行的代码,因为代码加上去毫无意义 2.b ...
- 聊一聊 webpack 中的 preloading 和 Prefetching
聊一聊 webpack 中的 preloading 和 Prefetching 提到 Preloading 和 Prefetching 就不得不先说一下代码分割,通过下面的例子我们来说明为什么需要代码 ...
- GTC 2019参会整理
NVIDIA GTC 2019在苏州金湖国际会议中心举行,由于同事有其他会议冲突,所以我代替他来参加了此次会议.作为刚接触GPU和机器学习不久的新人来说,感觉进入了一个新世界,深刻体验到技术的革新迭代 ...
- 计算机等级考试真题1(JAVA)
答案: 01-05 C D A A C 06-10 B/D C C C B 11-15 A C A C A 16-20 C B C 21-25 D D C D D 26-30 ...
- Vue与Django前后台分离跨域配置
一.跨域: 简单来说:如果前端向后端请求数据,前后端的的ip和端口都是不一致的,就是不在统一域名下,就出现了CORS跨域问题. 二.后台处理跨域 在django后台环境目录下安装插件: >: p ...
- [ASP.NET Core 3框架揭秘] 配置[4]:将配置绑定为对象
虽然应用程序可以直接利用通过IConfigurationBuilder对象创建的IConfiguration对象来提取配置数据,但是我们更倾向于将其转换成一个POCO对象,以面向对象的方式来使用配置, ...
- Dynamics 365 Portal Onpremise缓存问题
最近被Dynamics 365 Portal的缓存问题折腾得不轻,Portal的配置进行缓存也就算了,连CRM中的记录也进行了长达15分钟到2小时的缓存,这是完全无法接受的 试想,我们有一个Porta ...
- 63-容器在 Weave 中如何通信和隔离?
上一节我们分析了 Weave 的网络结构,今天讨论 Weave 的连通和隔离特性. 首先在host2 执行如下命令: weave launch 192.168.0.44 这里必须指定 host1 的 ...