有很多人问关于新版本中WMSYS.WM_CONCAT函数无法使用的问题。
ORA-00904: “WM_CONCAT”: invalid identifier
ORA-00904: “WM_CONCAT”: invalid identifier
对于该函数,Oracle官方的态度是其从来没有将该函数列入任何官方文档中,这个函数仅仅是让Oracle Dev研发在针对内部对象例如SYS的存储过程、字典表等使用的,并没有鼓励普通的应用开发者去使用该WMSYS.WM_CONCAT函数,但是由于部分应用开发者发现了这个函数,而且觉得较为好用,所以在应用程序编写过程中大量使用该函数,其结果是由于Oracle对该函数在后续版本中的修改(包括fix、增强)乃至于完全去掉这个函数都是有可能的。
不少人就遇到了这个问题,在新的11.2中没有找到该WMSYS.WM_CONCAT函数,也就意味着其应用程序无法在11.2上正常运行。
这里可以说最初发现这个WMSYS.WM_CONCAT函数的人,即做了一件好事,同时又做了一件坏事。
Oracle官方的态度是在11.2中应当使用 listagg函数而非WMSYS.WM_CONCAT。
关于LISTAGG:
Oracle® Database SQL Language Reference 11g Release 2 (11.2)
Oracle® Database SQL Language Reference 12c Release 1 (12.1)
但国内的一些朋友肯定还会坚持要在11.2中使用WMSYS.WM_CONCAT,这里提供一种workaround,自己用source来创建WMSYS.WM_CONCAT
sqlplus / as sysdba conn / as sysdba CREATE OR REPLACE type WM_CONCAT_IMPL wrapped a000000 1 abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd d 270 160 bg9hz+fBwa888VEZGViHFs/oOP0wg433f64df3QCWE7VehmhTFcUe3y+JrsniV3cSuvmnE3g Y93dtR+cCsU1N+UQDGbtzhCf2HIdr8lPzfgF2bmCTvmGlHQbTAjTftNrDq3p093ncwb32OyX 3ZFDTeH2jpjm3uWYyT8kZBfJIYxRwgLfRApoW32cpy0eRnvDBt2XfTAMXKCSNnqSoTiGA83W 6deKW+rWyBu9L/EPyFkmQZeBncNsiNDF8fa1Sm6vdQiEanlCQnaPJ11a0na8hK6psDSaey+x fdMupCwSvg6gMrSV4QCguhOCqW2AmxRVMqpXJootPpTBxBFZc7hORGbriUI= / Type created. #www.askmac.cn CREATE OR REPLACE function wm_concat wrapped a000000 1 abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd 8 58 96 +CuW1MAfZPVR6NOnXKVmXY2o9pswg8eZgcfLCNL+XhZy8K7/cgzcVrPnfMPnx3TAM7h0ZSXD j57Asr2ym9ZtFldFmFu+RdpAU8VGORKSvtVG+DmAOR4C+NTa+Pit2kDbEpI5zhZUgqameSkE DQ== / Function created. #https://www.askmac.cn/archives/wmsys-wm_concat.html #www.askmac.cn SQL> select wm_concat(object_id) from sys.user_objects / WM_CONCAT(OBJECT_ID) -------------------------------------------------------------------------------- 108674,108672,53144,53147,53150,53151,53162 1 row selected.
[…] 方法1、参考 http://www.askmaclean.com/archives/wmsys-wm_concat.html […]