合 ORA-00904: "WM_CONCAT": invalid identifier错误解决
Tags: Oracle故障处理新特性ORA-00904WM_CONCAT
现象
若在创建数据库的时候没有创建WMSYS用户,则在SQL或PL/SQL中有用到WM_CONCAT函数的时候就会报ORA-00904的错误。
1 2 3 4 5 | SYS@lhrsdb> SELECT WM_CONCAT(D.USER_ID) FROM DBA_USERS D WHERE D.USER_ID IN (0, 5); SELECT WM_CONCAT(D.USER_ID) FROM DBA_USERS D WHERE D.USER_ID IN (0, 5) * ERROR at line 1: ORA-00904: "WM_CONCAT": invalid identifier |
其实,WMSYS用户下的WM_CONCAT函数有很重要的用途,比如行转列,但是该函数不稳定。例如,在Oracle 10g上返回的是字符串类型,但是在Oracle 11gR2上返回的是CLOB类型。很多数据库开发人员在程序中都使用了该函数,若是系统升级,则会导致程序出现错误。为了减轻程序员修改程序的工作量,只有重建函数WM_CONCAT来解决该问题。
若没有创建WMSYS用户的话,则在查询DBA_OBJECTS视图的时候就不能查询到WM_CONCAT的相关信息。在正常情况下查询DBA_OBJECTS视图,会有如下的信息:
1 | SQL> SELECT * FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE 'WM_CONCAT%'; |
解决方案
解决办法分情况:
若Oracle版本是10g或11g,那么可以使用Oracle自带的脚本(owminst.plb)来创建WM_CONCAT函数;
若Oracle版本大于等于12c,那么只能自己创建函数来解决这个问题。虽然,在Oracle 12c中,脚本owminst.plb依然存在,但是执行完成后,并不会创建WM_CONCAT函数,所以只能使用自建函数来解决这个问题。
Oracle 10g或11g
若Oracle版本是10g或11g,用Oracle自带脚本重建WMSYS用户的WMSYS.WM_CONCAT函数: