【正确答案】若在创建数据库的时候没有创建WMSYS用户,则在SQL或PL/SQL中有用到WM_CONCAT函数的时候就会报ORA-00904的错误。其实,WMSYS用户下的WM_CONCAT函数有很重要的用途,比如行转列,但是该函数不稳定。例如,在Oracle 10g上返回的是字符串类型,但是在Oracle 11gR2上返回的是CLOB类型。很多数据库开发人员在程序中都使用了该函数,若是系统升级,则会导致程序出现错误。为了减轻程序员修改程序的工作量,只有重建函数WM_CONCAT来解决该问题。
若没有创建WMSYS用户的话,则在查询DBA_OBJECTS视图的时候就不能查询到WM_CONCAT的相关信息。在正常情况下查询DBA_OBJECTS视图,会有如下的信息:
解决办法有两种,一种是采用Oracle本身的脚本来创建WM_CONCAT函数,另一种是采用自己创建的函数来解决这个问题。
(1)用Oracle自带脚本重建WMSYS用户的WMSYS.WM_CONCAT函数 运行如下脚本卸载WMSYS用户的数据:

运行如下脚本安装WMSYS用户即可创建WMSYS.WM_CONCAT函数:

解锁WMSYS用户:

(2)自己订制脚本如果只是单个用户使用,那么不用刻意去创建WMSYS用户,可以在所需的用户下运行订制脚本,生成WM_CONCAT函数。另外,为了和系统的函数名区别开来,也可以修改函数名称。如果是多个用户使用,也可以运行自己订制的脚本,然后创建同义词,这样多个用户都可以使用,具体白定义函数参考pdf文件。
其实,与WM_CONCAT相似的还有一个函数是LISTAGG。这是一个Oracle的列转行函数,使用示例如下:
【答案解析】